1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.http.impl;
29
30 import java.io.IOException;
31 import java.io.OutputStream;
32 import java.net.Socket;
33 import java.nio.charset.CharsetDecoder;
34 import java.nio.charset.CharsetEncoder;
35
36 import org.apache.http.HttpEntity;
37 import org.apache.http.HttpEntityEnclosingRequest;
38 import org.apache.http.HttpException;
39 import org.apache.http.HttpRequest;
40 import org.apache.http.HttpResponse;
41 import org.apache.http.HttpServerConnection;
42 import org.apache.http.config.MessageConstraints;
43 import org.apache.http.entity.ContentLengthStrategy;
44 import org.apache.http.impl.entity.DisallowIdentityContentLengthStrategy;
45 import org.apache.http.impl.io.DefaultHttpRequestParserFactory;
46 import org.apache.http.impl.io.DefaultHttpResponseWriterFactory;
47 import org.apache.http.io.HttpMessageParser;
48 import org.apache.http.io.HttpMessageParserFactory;
49 import org.apache.http.io.HttpMessageWriter;
50 import org.apache.http.io.HttpMessageWriterFactory;
51 import org.apache.http.util.Args;
52
53
54
55
56
57
58 public class DefaultBHttpServerConnection extends BHttpConnectionBase implements HttpServerConnection {
59
60 private final HttpMessageParser<HttpRequest> requestParser;
61 private final HttpMessageWriter<HttpResponse> responseWriter;
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 public DefaultBHttpServerConnection(
84 final int bufferSize,
85 final int fragmentSizeHint,
86 final CharsetDecoder charDecoder,
87 final CharsetEncoder charEncoder,
88 final MessageConstraints constraints,
89 final ContentLengthStrategy incomingContentStrategy,
90 final ContentLengthStrategy outgoingContentStrategy,
91 final HttpMessageParserFactory<HttpRequest> requestParserFactory,
92 final HttpMessageWriterFactory<HttpResponse> responseWriterFactory) {
93 super(bufferSize, fragmentSizeHint, charDecoder, charEncoder, constraints,
94 incomingContentStrategy != null ? incomingContentStrategy :
95 DisallowIdentityContentLengthStrategy.INSTANCE, outgoingContentStrategy);
96 this.requestParser = (requestParserFactory != null ? requestParserFactory :
97 DefaultHttpRequestParserFactory.INSTANCE).create(getSessionInputBuffer(), constraints);
98 this.responseWriter = (responseWriterFactory != null ? responseWriterFactory :
99 DefaultHttpResponseWriterFactory.INSTANCE).create(getSessionOutputBuffer());
100 }
101
102 public DefaultBHttpServerConnection(
103 final int bufferSize,
104 final CharsetDecoder charDecoder,
105 final CharsetEncoder charEncoder,
106 final MessageConstraints constraints) {
107 this(bufferSize, bufferSize, charDecoder, charEncoder, constraints, null, null, null, null);
108 }
109
110 public DefaultBHttpServerConnection(final int bufferSize) {
111 this(bufferSize, bufferSize, null, null, null, null, null, null, null);
112 }
113
114 protected void onRequestReceived(final HttpRequest request) {
115 }
116
117 protected void onResponseSubmitted(final HttpResponse response) {
118 }
119
120 @Override
121 public void bind(final Socket socket) throws IOException {
122 super.bind(socket);
123 }
124
125 @Override
126 public HttpRequest receiveRequestHeader()
127 throws HttpException, IOException {
128 ensureOpen();
129 final HttpRequest request = this.requestParser.parse();
130 onRequestReceived(request);
131 incrementRequestCount();
132 return request;
133 }
134
135 @Override
136 public void receiveRequestEntity(final HttpEntityEnclosingRequest request)
137 throws HttpException, IOException {
138 Args.notNull(request, "HTTP request");
139 ensureOpen();
140 final HttpEntity entity = prepareInput(request);
141 request.setEntity(entity);
142 }
143
144 @Override
145 public void sendResponseHeader(final HttpResponse response)
146 throws HttpException, IOException {
147 Args.notNull(response, "HTTP response");
148 ensureOpen();
149 this.responseWriter.write(response);
150 onResponseSubmitted(response);
151 if (response.getStatusLine().getStatusCode() >= 200) {
152 incrementResponseCount();
153 }
154 }
155
156 @Override
157 public void sendResponseEntity(final HttpResponse response)
158 throws HttpException, IOException {
159 Args.notNull(response, "HTTP response");
160 ensureOpen();
161 final HttpEntity entity = response.getEntity();
162 if (entity == null) {
163 return;
164 }
165 final OutputStream outStream = prepareOutput(response);
166 entity.writeTo(outStream);
167 outStream.close();
168 }
169
170 @Override
171 public void flush() throws IOException {
172 ensureOpen();
173 doFlush();
174 }
175
176 }