View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  
20  package org.eclipse.jetty.server.session;
21  
22  
23  import static org.junit.Assert.assertEquals;
24  import static org.junit.Assert.assertTrue;
25  import static org.junit.Assert.assertNotNull;
26  
27  import java.io.File;
28  import java.io.FileOutputStream;
29  import java.io.IOException;
30  import java.io.InputStream;
31  import java.lang.reflect.Proxy;
32  import java.net.URL;
33  import java.net.URLClassLoader;
34  import java.util.jar.JarFile;
35  
36  import javax.servlet.ServletException;
37  import javax.servlet.http.HttpServlet;
38  import javax.servlet.http.HttpServletRequest;
39  import javax.servlet.http.HttpServletResponse;
40  import javax.servlet.http.HttpSession;
41  
42  import org.eclipse.jetty.client.HttpClient;
43  import org.eclipse.jetty.client.api.ContentResponse;
44  import org.eclipse.jetty.client.api.Request;
45  import org.eclipse.jetty.server.handler.ContextHandler;
46  import org.eclipse.jetty.servlet.ServletContextHandler;
47  import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
48  import org.eclipse.jetty.util.IO;
49  import org.eclipse.jetty.util.resource.JarResource;
50  import org.junit.Test;
51  
52  /**
53   * AbstractProxySerializationTest
54   *
55   *
56   */
57  public abstract class AbstractProxySerializationTest
58  {
59      public abstract AbstractTestServer createServer(int port, int max, int scavenge);
60      
61      public abstract void customizeContext (ServletContextHandler c);
62      
63     
64      
65      /**
66       * @param sec mseconds to sleep
67       */
68      public void pause(int msec)
69      {
70          try
71          {
72              Thread.sleep(msec);
73          }
74          catch (InterruptedException e)
75          {
76              e.printStackTrace();
77          }
78      }
79      
80      @Test
81      public void testProxySerialization() throws Exception
82      {
83          String contextPath = "";
84          String servletMapping = "/server";
85          int scavengePeriod = 10;
86          AbstractTestServer server = createServer(0, 20, scavengePeriod);
87          ServletContextHandler context = server.addContext(contextPath);
88  
89          InputStream is = this.getClass().getClassLoader().getResourceAsStream("proxy-serialization.jar");
90          
91          File testDir = MavenTestingUtils.getTargetTestingDir("proxy-serialization");
92          testDir.mkdirs();
93          
94          File extractedJar = new File (testDir, "proxy-serialization.jar");
95          extractedJar.createNewFile();
96          IO.copy(is, new FileOutputStream(extractedJar));
97   
98          
99          URLClassLoader loader = new URLClassLoader(new URL[] {extractedJar.toURI().toURL()}, Thread.currentThread().getContextClassLoader());
100         context.setClassLoader(loader);
101         context.addServlet("TestServlet", servletMapping);
102         customizeContext(context);
103         
104         try
105         {
106             server.start();
107             int port=server.getPort();
108             HttpClient client = new HttpClient();
109             client.start();
110             try
111             {
112                 ContentResponse response = client.GET("http://localhost:" + port + contextPath + servletMapping + "?action=create");
113                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
114                 String sessionCookie = response.getHeaders().getStringField("Set-Cookie");
115                 assertTrue(sessionCookie != null);
116                 // Mangle the cookie, replacing Path with $Path, etc.
117                 sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
118 
119                 //stop the context to be sure the sesssion will be passivated
120                 context.stop();
121                 
122                 //after a stop some of the volatile info is lost, so reinstate it
123                 context.setClassLoader(loader);
124                 context.addServlet("TestServlet", servletMapping);
125                 
126                 //restart the context
127                 context.start();
128                
129                 // Make another request using the session id from before
130                 Request request = client.newRequest("http://localhost:" + port + contextPath + servletMapping + "?action=test");
131                 request.header("Cookie", sessionCookie);
132                 response = request.send();
133                 assertEquals(HttpServletResponse.SC_OK,response.getStatus());
134             }
135             finally
136             {
137                 client.stop();
138             }
139         }
140         finally
141         {
142             server.stop();
143         }
144 
145     }
146 }