remm 02/03/08 15:50:31 Modified: coyote/src/java/org/apache/coyote/tomcat4 CoyoteProcessor.java CoyoteRequest.java CoyoteResponse.java Log: - Implement cookies and sessions. - One difference with Catalina is that the session cookie is added when the session is created. I couldn't find any drawback to this, and this is easier to implement. If there is a problem with tha, let me know. Revision Changes Path 1.9 +43 -5 jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteProcessor.java Index: CoyoteProcessor.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteProcessor.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- CoyoteProcessor.java 8 Mar 2002 20:52:27 -0000 1.8 +++ CoyoteProcessor.java 8 Mar 2002 23:50:31 -0000 1.9 @@ -1,6 +1,6 @@ -/* * $Header: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteProcessor.java,v 1.8 2002/03/08 20:52:27 remm Exp $ - * $Revision: 1.8 $ - * $Date: 2002/03/08 20:52:27 $ +/* * $Header: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteProcessor.java,v 1.9 2002/03/08 23:50:31 remm Exp $ + * $Revision: 1.9 $ + * $Date: 2002/03/08 23:50:31 $ * * ==================================================================== * @@ -73,6 +73,7 @@ import java.net.InetAddress; import java.net.Socket; import java.util.ArrayList; +import java.util.Enumeration; import java.util.Iterator; import java.util.Locale; import java.util.StringTokenizer; @@ -111,7 +112,7 @@ * * @author Craig R. McClanahan * @author Remy Maucherat - * @version $Revision: 1.8 $ $Date: 2002/03/08 20:52:27 $ + * @version $Revision: 1.9 $ $Date: 2002/03/08 23:50:31 $ */ final class CoyoteProcessor @@ -372,7 +373,7 @@ req.scheme().setString(connector.getScheme()); parseHost(); - // parseSession(req); + parseCookies(); } @@ -415,6 +416,43 @@ } request.setServerPort(port); } + } + } + + } + + + /** + * Parse cookies. + * Note: Using Coyote native cookie parser to parse cookies would be faster + * but a conversion to Catalina own cookies would then be needed, which + * would take away most if not all of theperformance benefit. + */ + protected void parseCookies() { + + Enumeration values = request.getHeaders("cookie"); + while (values.hasMoreElements()) { + String value = values.nextElement().toString(); + Cookie cookies[] = RequestUtil.parseCookieHeader(value); + for (int i = 0; i < cookies.length; i++) { + if (cookies[i].getName().equals + (Globals.SESSION_COOKIE_NAME)) { + // Override anything requested in the URL + if (!request.isRequestedSessionIdFromCookie()) { + // Accept only the first session id cookie + request.setRequestedSessionId(cookies[i].getValue()); + request.setRequestedSessionCookie(true); + request.setRequestedSessionURL(false); + if (debug >= 1) + log(" Requested cookie session id is " + + ((HttpServletRequest) request.getRequest()) + .getRequestedSessionId()); + } + } + if (debug >= 1) + log(" Adding cookie " + cookies[i].getName() + "=" + + cookies[i].getValue()); + request.addCookie(cookies[i]); } } 1.6 +182 -14 jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteRequest.java Index: CoyoteRequest.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteRequest.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- CoyoteRequest.java 8 Mar 2002 20:52:27 -0000 1.5 +++ CoyoteRequest.java 8 Mar 2002 23:50:31 -0000 1.6 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteRequest.java,v 1.5 2002/03/08 20:52:27 remm Exp $ - * $Revision: 1.5 $ - * $Date: 2002/03/08 20:52:27 $ + * $Header: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteRequest.java,v 1.6 2002/03/08 23:50:31 remm Exp $ + * $Revision: 1.6 $ + * $Date: 2002/03/08 23:50:31 $ * * ==================================================================== * @@ -71,7 +71,9 @@ import java.io.BufferedReader; import java.io.UnsupportedEncodingException; import java.net.Socket; +import java.security.AccessController; import java.security.Principal; +import java.security.PrivilegedAction; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -89,6 +91,7 @@ import javax.servlet.ServletRequest; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.tomcat.util.http.Parameters; @@ -117,13 +120,32 @@ * * @author Remy Maucherat * @author Craig R. McClanahan - * @version $Revision: 1.5 $ $Date: 2002/03/08 20:52:27 $ + * @version $Revision: 1.6 $ $Date: 2002/03/08 23:50:31 $ */ public class CoyoteRequest implements HttpRequest, HttpServletRequest { + // --------------------------------------- PrivilegedGetSession Inner Class + + + protected class PrivilegedGetSession + implements PrivilegedAction { + + private boolean create; + + PrivilegedGetSession(boolean create) { + this.create = create; + } + + public Object run() { + return doGetSession(create); + } + + } + + // ------------------------------------------------------------- Properties @@ -301,6 +323,36 @@ protected ParameterMap parameterMap = new ParameterMap(); + /** + * The currently active session for this request. + */ + protected Session session = null; + + + /** + * Was the requested session ID received in a cookie? + */ + protected boolean requestedSessionCookie = false; + + + /** + * The requested session ID (if any) for this request. + */ + protected String requestedSessionId = null; + + + /** + * Was the requested session ID received in a URL? + */ + protected boolean requestedSessionURL = false; + + + /** + * The socket through which this Request was received. + */ + protected Socket socket = null; + + // --------------------------------------------------------- Public Methods @@ -310,6 +362,8 @@ */ public void recycle() { + socket = null; + context = null; wrapper = null; @@ -331,6 +385,11 @@ notes.clear(); cookies.clear(); + session = null; + requestedSessionCookie = false; + requestedSessionId = null; + requestedSessionURL = false; + parameterMap.setLocked(false); parameterMap.clear(); @@ -475,7 +534,7 @@ * an SSLSocket. */ public Socket getSocket() { - return (null); // FIXME: Return a note + return (socket); } /** @@ -484,6 +543,7 @@ * @param socket The socket through which this request was received */ public void setSocket(Socket socket) { + this.socket = socket; } @@ -1084,8 +1144,7 @@ * @param value The new header value */ public void addHeader(String name, String value) { - // Not used ? - System.out.println("coyoteRequest.addHeader(name, value)"); + // Not used } @@ -1216,7 +1275,9 @@ * @param flag The new flag */ public void setRequestedSessionCookie(boolean flag) { - // Not used + + this.requestedSessionCookie = flag; + } @@ -1227,7 +1288,9 @@ * @param id The new session id */ public void setRequestedSessionId(String id) { - // Not used + + this.requestedSessionId = id; + } @@ -1239,7 +1302,9 @@ * @param flag The new flag */ public void setRequestedSessionURL(boolean flag) { - // Not used + + this.requestedSessionURL = flag; + } @@ -1532,7 +1597,13 @@ * @param create Create a new session if one does not exist */ public HttpSession getSession(boolean create) { - return null; + + if (System.getSecurityManager() != null) { + PrivilegedGetSession dp = new PrivilegedGetSession(create); + return (HttpSession) AccessController.doPrivileged(dp); + } + return doGetSession(create); + } @@ -1541,7 +1612,12 @@ * request came from a cookie. */ public boolean isRequestedSessionIdFromCookie() { - return false; + + if (requestedSessionId != null) + return (requestedSessionCookie); + else + return (false); + } @@ -1550,7 +1626,12 @@ * request came from the request URI. */ public boolean isRequestedSessionIdFromURL() { - return false; + + if (requestedSessionId != null) + return (requestedSessionURL); + else + return (false); + } @@ -1571,7 +1652,25 @@ * request identifies a valid session. */ public boolean isRequestedSessionIdValid() { - return false; + + if (requestedSessionId == null) + return (false); + if (context == null) + return (false); + Manager manager = context.getManager(); + if (manager == null) + return (false); + Session session = null; + try { + session = manager.findSession(requestedSessionId); + } catch (IOException e) { + session = null; + } + if ((session != null) && session.isValid()) + return (true); + else + return (false); + } @@ -1617,6 +1716,75 @@ // ------------------------------------------------------ Protected Methods + + + protected HttpSession doGetSession(boolean create) { + + // There cannot be a session if no context has been assigned yet + if (context == null) + return (null); + + // Return the current session if it exists and is valid + if ((session != null) && !session.isValid()) + session = null; + if (session != null) + return (session.getSession()); + + // Return the requested session if it exists and is valid + Manager manager = null; + if (context != null) + manager = context.getManager(); + if (manager == null) + return (null); // Sessions are not supported + if (requestedSessionId != null) { + try { + session = manager.findSession(requestedSessionId); + } catch (IOException e) { + session = null; + } + if ((session != null) && !session.isValid()) + session = null; + if (session != null) { + return (session.getSession()); + } + } + + // Create a new session if requested and the response is not committed + if (!create) + return (null); + if ((context != null) && (response != null) && + context.getCookies() && + response.getResponse().isCommitted()) { + throw new IllegalStateException + (sm.getString("httpRequestBase.createCommitted")); + } + + session = manager.createSession(); + + // Creating a new session cookie based on that session + if ((session != null) && (getContext() != null) + && getContext().getCookies()) { + Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME, + session.getId()); + cookie.setMaxAge(-1); + String contextPath = null; + if (context != null) + contextPath = context.getPath(); + if ((contextPath != null) && (contextPath.length() > 0)) + cookie.setPath(contextPath); + else + cookie.setPath("/"); + if (isSecure()) + cookie.setSecure(true); + ((HttpServletResponse) response).addCookie(cookie); + } + + if (session != null) + return (session.getSession()); + else + return (null); + + } /** 1.5 +15 -4 jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteResponse.java Index: CoyoteResponse.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteResponse.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- CoyoteResponse.java 8 Mar 2002 05:13:28 -0000 1.4 +++ CoyoteResponse.java 8 Mar 2002 23:50:31 -0000 1.5 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteResponse.java,v 1.4 2002/03/08 05:13:28 remm Exp $ - * $Revision: 1.4 $ - * $Date: 2002/03/08 05:13:28 $ + * $Header: /home/cvs/jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat4/CoyoteResponse.java,v 1.5 2002/03/08 23:50:31 remm Exp $ + * $Revision: 1.5 $ + * $Date: 2002/03/08 23:50:31 $ * * ==================================================================== * @@ -90,6 +90,7 @@ import javax.servlet.http.HttpUtils; import org.apache.tomcat.util.http.MimeHeaders; +import org.apache.tomcat.util.http.ServerCookie; import org.apache.coyote.Response; @@ -112,7 +113,7 @@ * * @author Remy Maucherat * @author Craig R. McClanahan - * @version $Revision: 1.4 $ $Date: 2002/03/08 05:13:28 $ + * @version $Revision: 1.5 $ $Date: 2002/03/08 23:50:31 $ */ public class CoyoteResponse @@ -805,6 +806,16 @@ return; cookies.add(cookie); + + StringBuffer sb = new StringBuffer(); + ServerCookie.appendCookieValue + (sb, cookie.getVersion(), cookie.getName(), cookie.getValue(), + cookie.getPath(), cookie.getDomain(), cookie.getComment(), + cookie.getMaxAge(), cookie.getSecure()); + // the header name is Set-Cookie for both "old" and v.1 ( RFC2109 ) + // RFC2965 is not supported by browsers and the Servlet spec + // asks for 2109. + addHeader("Set-Cookie", sb.toString()); }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>