1
2
3
4
5
6
7
8
9
10
11
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 }