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  package org.eclipse.jetty.nested;
20  
21  import java.io.IOException;
22  import java.util.Enumeration;
23  
24  import javax.servlet.ServletException;
25  import javax.servlet.ServletInputStream;
26  import javax.servlet.http.HttpServletRequest;
27  import javax.servlet.http.HttpServletResponse;
28  
29  import org.eclipse.jetty.http.HttpFields;
30  import org.eclipse.jetty.http.HttpURI;
31  import org.eclipse.jetty.io.Connection;
32  import org.eclipse.jetty.server.AbstractHttpConnection;
33  import org.eclipse.jetty.server.DispatcherType;
34  
35  
36  public class NestedConnection extends AbstractHttpConnection
37  {
38      protected NestedConnection(final NestedConnector connector, final NestedEndPoint endp, final HttpServletRequest outerRequest, HttpServletResponse outerResponse,String nestedIn)
39          throws IOException
40      {
41          super(connector,
42                endp,
43                connector.getServer(),
44                new NestedParser(),
45                new NestedGenerator(connector.getResponseBuffers(),endp,outerResponse,nestedIn),
46                new NestedRequest(outerRequest));
47  
48          ((NestedRequest)_request).setConnection(this);
49          
50          // Set the request line
51          _request.setDispatcherType(DispatcherType.REQUEST);
52          _request.setScheme(outerRequest.getScheme());
53          _request.setMethod(outerRequest.getMethod());
54          String uri=outerRequest.getQueryString()==null?outerRequest.getRequestURI():(outerRequest.getRequestURI()+"?"+outerRequest.getQueryString());
55          _request.setUri(new HttpURI(uri));
56          _request.setPathInfo(outerRequest.getRequestURI());
57          _request.setQueryString(outerRequest.getQueryString());
58          _request.setProtocol(outerRequest.getProtocol());
59          
60          // Set the headers
61          HttpFields fields = getRequestFields();
62          for (Enumeration<String> e=outerRequest.getHeaderNames();e.hasMoreElements();)
63          {
64              String header=e.nextElement();
65              String value=outerRequest.getHeader(header);
66              fields.add(header,value);
67          }
68          
69          // Let outer parse the cookies
70          _request.setCookies(outerRequest.getCookies());
71          
72          // copy request attributes
73          for (Enumeration<String> e=outerRequest.getAttributeNames();e.hasMoreElements();)
74          {
75              String attr=e.nextElement();
76              _request.setAttribute(attr,outerRequest.getAttribute(attr));
77          }
78          
79          // customize the request
80          connector.customize(endp,_request);
81          
82          // System.err.println(_request.getMethod()+" "+_request.getUri()+" "+_request.getProtocol());
83          // System.err.println(fields.toString());
84      }
85  
86      void service() throws IOException, ServletException
87      {
88          setCurrentConnection(this);
89          try
90          {
91              getServer().handle(this);
92              completeResponse();
93              while (!_generator.isComplete() && _endp.isOpen())
94                  _generator.flushBuffer();
95              _endp.flush();
96          }
97          finally
98          {
99              setCurrentConnection(null);
100         }
101     }
102 
103     /* (non-Javadoc)
104      * @see org.eclipse.jetty.server.HttpConnection#getInputStream()
105      */
106     @Override
107     public ServletInputStream getInputStream() throws IOException
108     {
109         return ((NestedEndPoint)_endp).getServletInputStream();
110     }
111 
112     /* (non-Javadoc)
113      * @see org.eclipse.jetty.server.HttpConnection#handle()
114      */
115     @Override
116     public Connection handle() throws IOException
117     {
118         throw new IllegalStateException();
119     }
120 
121 }