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.util.StringUtil;
24
25 public class LocalConnector extends AbstractConnector
26 {
27 private final BlockingQueue<Request> requests = new LinkedBlockingQueue<Request>();
28
29 public Object getConnection()
30 {
31 return this;
32 }
33
34
35
36
37 @Deprecated
38 public void reopen()
39 {
40 }
41
42 public String getResponses(String requests) throws Exception
43 {
44 return getResponses(requests, false);
45 }
46
47 public String getResponses(String requests, boolean keepOpen) throws Exception
48 {
49 ByteArrayBuffer result = getResponses(new ByteArrayBuffer(requests, StringUtil.__ISO_8859_1), keepOpen);
50 return result.toString(StringUtil.__ISO_8859_1);
51 }
52
53 public ByteArrayBuffer getResponses(ByteArrayBuffer requestsBuffer, boolean keepOpen) throws Exception
54 {
55 CountDownLatch latch = new CountDownLatch(1);
56 Request request = new Request(requestsBuffer, keepOpen, latch);
57 requests.add(request);
58 latch.await();
59 return request.getResponsesBuffer();
60 }
61
62 protected void accept(int acceptorID) throws IOException, InterruptedException
63 {
64 Request request = requests.take();
65 getThreadPool().dispatch(request);
66 }
67
68 public void open() throws IOException
69 {
70 }
71
72 public void close() throws IOException
73 {
74 }
75
76 public int getLocalPort()
77 {
78 return -1;
79 }
80
81 public void executeRequest(String rawRequest) throws IOException
82 {
83 Request request = new Request(new ByteArrayBuffer(rawRequest, "UTF-8"), true, null);
84 requests.add(request);
85 }
86
87 private class Request implements Runnable
88 {
89 private final ByteArrayBuffer requestsBuffer;
90 private final boolean keepOpen;
91 private final CountDownLatch latch;
92 private volatile ByteArrayBuffer responsesBuffer;
93
94 private Request(ByteArrayBuffer requestsBuffer, boolean keepOpen, CountDownLatch latch)
95 {
96 this.requestsBuffer = requestsBuffer;
97 this.keepOpen = keepOpen;
98 this.latch = latch;
99 }
100
101 public void run()
102 {
103 ByteArrayEndPoint endPoint = new ByteArrayEndPoint(requestsBuffer.asArray(), 1024);
104 endPoint.setGrowOutput(true);
105
106 HttpConnection connection = new HttpConnection(LocalConnector.this, endPoint, getServer());
107 connectionOpened(connection);
108
109 boolean leaveOpen = keepOpen;
110 try
111 {
112 while (endPoint.getIn().length() > 0)
113 connection.handle();
114 }
115 catch (Exception x)
116 {
117 leaveOpen = false;
118 }
119 finally
120 {
121 if (!leaveOpen)
122 connectionClosed(connection);
123 responsesBuffer = endPoint.getOut();
124 if (latch != null)
125 latch.countDown();
126 }
127 }
128
129 public ByteArrayBuffer getResponsesBuffer()
130 {
131 return responsesBuffer;
132 }
133 }
134 }