From bc4f45bbfe1012adea785df84e383673f5f914c2 Mon Sep 17 00:00:00 2001 From: Jan Bartel <janb@intalio.com> Date: Mon, 20 Aug 2012 08:40:04 +1000 Subject: [PATCH 1/3] JETTY-1532 HTTP headers decoded with platform's default encoding --- .../src/main/java/org/eclipse/jetty/http/MimeTypes.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java b/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java index e20dde3cdb1..7ec00e24095 100644 --- a/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java +++ b/jetty-http/src/main/java/org/eclipse/jetty/http/MimeTypes.java @@ -364,12 +364,12 @@ public class MimeTypes case 10: if (!quote && (';'==b || ' '==b )|| (quote && '"'==b )) - return CACHE.lookup(value.peek(start,i-start)).toString(); + return CACHE.lookup(value.peek(start,i-start)).toString(StringUtil.__UTF8); } } if (state==10) - return CACHE.lookup(value.peek(start,i-start)).toString(); + return CACHE.lookup(value.peek(start,i-start)).toString(StringUtil.__UTF8); return (String)__encodings.get(value); } From e0276a8f65f882b0468d8b299e3ad362b1bfb536 Mon Sep 17 00:00:00 2001 From: Jan Bartel <janb@intalio.com> Date: Mon, 20 Aug 2012 14:52:33 +1000 Subject: [PATCH 2/3] JETTY-1515 Include cookies on 304 responses from DefaultServlet. --- .../org/eclipse/jetty/server/Response.java | 34 ++++++++++++++++ .../eclipse/jetty/server/ResponseTest.java | 39 +++++++++++++++++++ .../eclipse/jetty/servlet/DefaultServlet.java | 20 ++++++---- 3 files changed, 86 insertions(+), 7 deletions(-) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java index ba8081bc6d5..49f6d1551dc 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Response.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.server; import java.io.IOException; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.Locale; @@ -77,6 +78,16 @@ public class Response implements HttpServletResponse */ public final static String HTTP_ONLY_COMMENT="__HTTP_ONLY__"; + + /* ------------------------------------------------------------ */ + public static Response getResponse(HttpServletResponse response) + { + if (response instanceof Response) + return (Response)response; + + return AbstractHttpConnection.getCurrentConnection().getResponse(); + } + private final AbstractHttpConnection _connection; private int _status=SC_OK; private String _reason; @@ -1070,6 +1081,29 @@ public class Response implements HttpServletResponse } } + + public void reset(boolean preserveCookies) + { + if (!preserveCookies) + reset(); + else + { + HttpFields response_fields=_connection.getResponseFields(); + + ArrayList<String> cookieValues = new ArrayList<String>(5); + Enumeration vals = response_fields.getValues(HttpHeaders.SET_COOKIE); + while (vals.hasMoreElements()) + cookieValues.add((String)vals.nextElement()); + + reset(); + + for (String v:cookieValues) + response_fields.add(HttpHeaders.SET_COOKIE, v); + } + } + + + /* ------------------------------------------------------------ */ /* * @see javax.servlet.ServletResponse#reset() diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java index 4c71ab09334..0c205b0bfc9 100644 --- a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java +++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java @@ -20,6 +20,7 @@ package org.eclipse.jetty.server; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -28,6 +29,8 @@ import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.PrintWriter; import java.net.Socket; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.Locale; import java.util.Map; @@ -556,6 +559,42 @@ public class ResponseTest assertEquals("name=value;Comment=comment;Path=/path;Domain=domain;Secure;HttpOnly",set); } + + + @Test + public void testCookiesWithReset() throws Exception + { + Response response = new Response(new TestHttpConnection(connector,new ByteArrayEndPoint(), connector.getServer())); + + Cookie cookie=new Cookie("name","value"); + cookie.setDomain("domain"); + cookie.setPath("/path"); + cookie.setSecure(true); + cookie.setComment("comment__HTTP_ONLY__"); + response.addCookie(cookie); + + Cookie cookie2=new Cookie("name2", "value2"); + cookie2.setDomain("domain"); + cookie2.setPath("/path"); + response.addCookie(cookie2); + + //keep the cookies + response.reset(true); + + Enumeration<String> set = response.getHttpFields().getValues("Set-Cookie"); + + assertNotNull(set); + ArrayList<String> list = Collections.list(set); + assertEquals(2, list.size()); + assertTrue(list.contains("name=value;Comment=comment;Path=/path;Domain=domain;Secure;HttpOnly")); + assertTrue(list.contains("name2=value2;Path=/path;Domain=domain")); + + //get rid of the cookies + response.reset(); + + set = response.getHttpFields().getValues("Set-Cookie"); + assertFalse(set.hasMoreElements()); + } private Response newResponse() { diff --git a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java index 1f443972b0e..c5b91cacc9d 100644 --- a/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java +++ b/jetty-servlet/src/main/java/org/eclipse/jetty/servlet/DefaultServlet.java @@ -24,6 +24,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Map; @@ -674,6 +675,9 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory String ifms=request.getHeader(HttpHeaders.IF_MODIFIED_SINCE); if (ifms!=null) { + //Get jetty's Response impl + Response r = Response.getResponse(response); + if (content!=null) { Buffer mdlm=content.getLastModified(); @@ -681,9 +685,9 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory { if (ifms.equals(mdlm.toString())) { - response.reset(); - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - response.flushBuffer(); + r.reset(true); + r.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + r.flushBuffer(); return false; } } @@ -693,10 +697,10 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory if (ifmsl!=-1) { if (resource.lastModified()/1000 <= ifmsl/1000) - { - response.reset(); - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - response.flushBuffer(); + { + r.reset(true); + r.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + r.flushBuffer(); return false; } } @@ -1025,6 +1029,8 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory if (_cacheControl!=null) response.setHeader(HttpHeaders.CACHE_CONTROL,_cacheControl.toString()); } + + /* ------------------------------------------------------------ */ /* From c1a454c2780f6a70a70399f15b937df536c82647 Mon Sep 17 00:00:00 2001 From: Greg Wilkins <gregw@intalio.com> Date: Mon, 20 Aug 2012 22:28:03 +1000 Subject: [PATCH 3/3] avoided race in FormAuth by not sending redirect until after session attribute set --- .../authentication/FormAuthenticator.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java index 6bfae412fb0..ccb00a200d6 100644 --- a/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java +++ b/jetty-security/src/main/java/org/eclipse/jetty/security/authentication/FormAuthenticator.java @@ -216,19 +216,20 @@ public class FormAuthenticator extends LoginAuthenticator synchronized(session) { nuri = (String) session.getAttribute(__J_URI); - } - - if (nuri == null || nuri.length() == 0) - { - nuri = request.getContextPath(); - if (nuri.length() == 0) - nuri = URIUtil.SLASH; + + if (nuri == null || nuri.length() == 0) + { + nuri = request.getContextPath(); + if (nuri.length() == 0) + nuri = URIUtil.SLASH; + } + + Authentication cached=new SessionAuthentication(getAuthMethod(),user,password); + session.setAttribute(SessionAuthentication.__J_AUTHENTICATED, cached); } response.setContentLength(0); response.sendRedirect(response.encodeRedirectURL(nuri)); - - Authentication cached=new SessionAuthentication(getAuthMethod(),user,password); - session.setAttribute(SessionAuthentication.__J_AUTHENTICATED, cached); + return new FormAuthentication(getAuthMethod(),user); }