View Javadoc

1   // ========================================================================
2   // Copyright (c) 2010-2011 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
12  // ========================================================================
13  package org.eclipse.jetty.nested;
14  
15  import java.io.IOException;
16  import java.util.Enumeration;
17  
18  import javax.servlet.ServletContext;
19  import javax.servlet.ServletException;
20  import javax.servlet.ServletInputStream;
21  import javax.servlet.http.HttpServletRequest;
22  import javax.servlet.http.HttpServletResponse;
23  
24  import org.eclipse.jetty.http.HttpFields;
25  import org.eclipse.jetty.http.HttpURI;
26  import org.eclipse.jetty.io.Connection;
27  import org.eclipse.jetty.server.Connector;
28  import org.eclipse.jetty.server.DispatcherType;
29  import org.eclipse.jetty.server.HttpConnection;
30  import org.eclipse.jetty.server.Server;
31  import org.eclipse.jetty.util.log.Log;
32  
33  
34  public class NestedConnection extends HttpConnection
35  {
36      protected NestedConnection(final NestedConnector connector, final NestedEndPoint endp, final HttpServletRequest outerRequest, HttpServletResponse outerResponse,String nestedIn)
37          throws IOException
38      {
39          super(connector,
40                endp,
41                connector.getServer(),
42                new NestedParser(),
43                new NestedGenerator(connector.getResponseBuffers(),endp,outerResponse,nestedIn),
44                new NestedRequest(outerRequest));
45  
46          ((NestedRequest)_request).setConnection(this);
47          
48          // Set the request line
49          _request.setDispatcherType(DispatcherType.REQUEST);
50          _request.setScheme(outerRequest.getScheme());
51          _request.setMethod(outerRequest.getMethod());
52          String uri=outerRequest.getQueryString()==null?outerRequest.getRequestURI():(outerRequest.getRequestURI()+"?"+outerRequest.getQueryString());
53          _request.setUri(new HttpURI(uri));
54          _request.setPathInfo(outerRequest.getRequestURI());
55          _request.setQueryString(outerRequest.getQueryString());
56          _request.setProtocol(outerRequest.getProtocol());
57          
58          // Set the headers
59          HttpFields fields = getRequestFields();
60          for (Enumeration<String> e=outerRequest.getHeaderNames();e.hasMoreElements();)
61          {
62              String header=e.nextElement();
63              String value=outerRequest.getHeader(header);
64              fields.add(header,value);
65          }
66          
67          // Let outer parse the cookies
68          _request.setCookies(outerRequest.getCookies());
69          
70          // copy request attributes
71          for (Enumeration<String> e=outerRequest.getAttributeNames();e.hasMoreElements();)
72          {
73              String attr=e.nextElement();
74              _request.setAttribute(attr,outerRequest.getAttribute(attr));
75          }
76          
77          // customize the request
78          connector.customize(endp,_request);
79          
80          // System.err.println(_request.getMethod()+" "+_request.getUri()+" "+_request.getProtocol());
81          // System.err.println(fields.toString());
82      }
83  
84      void service() throws IOException, ServletException
85      {
86          setCurrentConnection(this);
87          try
88          {
89              getServer().handle(this);
90              completeResponse();
91              while (!_generator.isComplete() && _endp.isOpen())
92                  _generator.flushBuffer();
93              _endp.flush();
94          }
95          finally
96          {
97              setCurrentConnection(null);
98          }
99      }
100 
101     /* (non-Javadoc)
102      * @see org.eclipse.jetty.server.HttpConnection#getInputStream()
103      */
104     @Override
105     public ServletInputStream getInputStream() throws IOException
106     {
107         return ((NestedEndPoint)_endp).getServletInputStream();
108     }
109 
110     /* (non-Javadoc)
111      * @see org.eclipse.jetty.server.HttpConnection#handle()
112      */
113     @Override
114     public Connection handle() throws IOException
115     {
116         throw new IllegalStateException();
117     }
118 
119 }