View Javadoc

1   // ========================================================================
2   // Copyright (c) 2006-2009 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  
14  package org.eclipse.jetty.server;
15  
16  import java.io.IOException;
17  import java.util.concurrent.BlockingQueue;
18  import java.util.concurrent.CountDownLatch;
19  import java.util.concurrent.LinkedBlockingQueue;
20  
21  import org.eclipse.jetty.io.ByteArrayBuffer;
22  import org.eclipse.jetty.io.ByteArrayEndPoint;
23  import org.eclipse.jetty.io.Connection;
24  import org.eclipse.jetty.util.StringUtil;
25  import org.eclipse.jetty.util.log.Log;
26  
27  public class LocalConnector extends AbstractConnector
28  {
29      private final BlockingQueue<Request> requests = new LinkedBlockingQueue<Request>();
30  
31      public Object getConnection()
32      {
33          return this;
34      }
35  
36      public String getResponses(String requests) throws Exception
37      {
38          return getResponses(requests, false);
39      }
40  
41      public String getResponses(String requests, boolean keepOpen) throws Exception
42      {
43          ByteArrayBuffer result = getResponses(new ByteArrayBuffer(requests, StringUtil.__ISO_8859_1), keepOpen);
44          return result.toString(StringUtil.__ISO_8859_1);
45      }
46  
47      public ByteArrayBuffer getResponses(ByteArrayBuffer requestsBuffer, boolean keepOpen) throws Exception
48      {
49          CountDownLatch latch = new CountDownLatch(1);
50          Request request = new Request(requestsBuffer, keepOpen, latch);
51          requests.add(request);
52          latch.await();
53          return request.getResponsesBuffer();
54      }
55  
56      @Override
57      protected void accept(int acceptorID) throws IOException, InterruptedException
58      {
59          Request request = requests.take();
60          getThreadPool().dispatch(request);
61      }
62  
63      public void open() throws IOException
64      {
65      }
66  
67      public void close() throws IOException
68      {
69      }
70  
71      public int getLocalPort()
72      {
73          return -1;
74      }
75  
76      public void executeRequest(String rawRequest) throws IOException
77      {
78          Request request = new Request(new ByteArrayBuffer(rawRequest, "UTF-8"), true, null);
79          requests.add(request);
80      }
81  
82      private class Request implements Runnable
83      {
84          private final ByteArrayBuffer requestsBuffer;
85          private final boolean keepOpen;
86          private final CountDownLatch latch;
87          private volatile ByteArrayBuffer responsesBuffer;
88  
89          private Request(ByteArrayBuffer requestsBuffer, boolean keepOpen, CountDownLatch latch)
90          {
91              this.requestsBuffer = requestsBuffer;
92              this.keepOpen = keepOpen;
93              this.latch = latch;
94          }
95  
96          public void run()
97          {
98              ByteArrayEndPoint endPoint = new ByteArrayEndPoint(requestsBuffer.asArray(), 1024)
99              {
100                 @Override
101                 public void setConnection(Connection connection)
102                 {
103                     connectionUpgraded(getConnection(),connection);
104                     super.setConnection(connection);
105                 }
106             };
107             
108             endPoint.setGrowOutput(true);
109             HttpConnection connection = new HttpConnection(LocalConnector.this, endPoint, getServer());
110             endPoint.setConnection(connection);
111             connectionOpened(connection);
112             
113             boolean leaveOpen = keepOpen;
114             try
115             {
116                 while (endPoint.getIn().length() > 0 && endPoint.isOpen())
117                 {
118                     while (true)
119                     {
120                         final Connection con = endPoint.getConnection();
121                         final Connection next = con.handle();
122                         if (next!=con)
123                         {  
124                             endPoint.setConnection(next);
125                             continue;
126                         }
127                         break;
128                     }
129                 }
130             }
131             catch (Exception x)
132             {
133                 leaveOpen = false;
134             }
135             finally
136             {
137                 if (!leaveOpen)
138                     connectionClosed(connection);
139                 responsesBuffer = endPoint.getOut();
140                 if (latch != null)
141                     latch.countDown();
142             }
143         }
144 
145         public ByteArrayBuffer getResponsesBuffer()
146         {
147             return responsesBuffer;
148         }
149     }
150 }