43
43
import org .glassfish .grizzly .filterchain .NextAction ;
44
44
import org .glassfish .grizzly .http .HttpRequestPacket ;
45
45
import org .glassfish .grizzly .http .Method ;
46
+ import org .glassfish .grizzly .http .ProcessingState ;
46
47
import org .glassfish .grizzly .http .Protocol ;
47
48
import org .glassfish .grizzly .http .util .CookieSerializerUtils ;
48
49
import org .glassfish .grizzly .http .util .Header ;
60
61
import java .util .Collection ;
61
62
import java .util .List ;
62
63
import java .util .Map ;
64
+ import java .util .concurrent .ConcurrentLinkedQueue ;
63
65
64
66
import static org .asynchttpclient .providers .grizzly .filters .SwitchingSSLFilter .getHandshakeError ;
65
67
import static org .asynchttpclient .util .AsyncHttpProviderUtils .getAuthority ;
66
68
import static org .asynchttpclient .util .MiscUtil .isNonEmpty ;
67
69
68
70
public final class AsyncHttpClientFilter extends BaseFilter {
69
71
72
+ private ConcurrentLinkedQueue <HttpRequestPacketImpl > requestCache
73
+ = new ConcurrentLinkedQueue <HttpRequestPacketImpl >();
70
74
71
75
private final AsyncHttpClientConfig config ;
72
76
private final GrizzlyAsyncHttpProvider grizzlyAsyncHttpProvider ;
@@ -188,29 +192,31 @@ private boolean sendAsGrizzlyRequest(final Request request,
188
192
convertToUpgradeRequest (httpCtx );
189
193
}
190
194
191
- final HttpRequestPacket .Builder builder = HttpRequestPacket .builder ();
192
- builder .method (request .getMethod ());
193
- builder .protocol (Protocol .HTTP_1_1 );
195
+ HttpRequestPacket requestPacket = requestCache .poll ();
196
+ if (requestPacket == null ) {
197
+ requestPacket = new HttpRequestPacketImpl ();
198
+ }
199
+ requestPacket .setMethod (request .getMethod ());
200
+ requestPacket .setProtocol (Protocol .HTTP_1_1 );
194
201
195
202
// Special handling for CONNECT.
196
203
if (Method .CONNECT .matchesMethod (request .getMethod ())) {
197
204
final int port = uri .getPort ();
198
- builder . uri (uri .getHost () + ':' + (port == -1 ? 443 : port ));
205
+ requestPacket . setRequestURI (uri .getHost () + ':' + (port == -1 ? 443 : port ));
199
206
} else {
200
- builder . uri (uri .getPath ());
207
+ requestPacket . setRequestURI (uri .getPath ());
201
208
}
202
209
203
210
if (GrizzlyAsyncHttpProvider .requestHasEntityBody (request )) {
204
211
final long contentLength = request .getContentLength ();
205
212
if (contentLength > 0 ) {
206
- builder . contentLength (contentLength );
207
- builder . chunked (false );
213
+ requestPacket . setContentLengthLong (contentLength );
214
+ requestPacket . setChunked (false );
208
215
} else {
209
- builder . chunked (true );
216
+ requestPacket . setChunked (true );
210
217
}
211
218
}
212
219
213
- HttpRequestPacket requestPacket ;
214
220
if (httpCtx .isWSRequest () && !httpCtx .isEstablishingTunnel ()) {
215
221
try {
216
222
final URI wsURI = new URI (httpCtx .getWsRequestURI ());
@@ -222,13 +228,11 @@ private boolean sendAsGrizzlyRequest(final Request request,
222
228
} catch (URISyntaxException e ) {
223
229
throw new IllegalArgumentException ("Invalid WS URI: " + httpCtx .getWsRequestURI ());
224
230
}
225
- } else {
226
- requestPacket = builder .build ();
227
231
}
228
232
229
233
requestPacket .setSecure (secure );
230
234
addQueryString (request , requestPacket );
231
- addHostHeader (request , uri , builder );
235
+ addHostHeader (request , uri , requestPacket );
232
236
addGeneralHeaders (request , requestPacket );
233
237
addCookies (request , requestPacket );
234
238
@@ -325,15 +329,15 @@ private static FilterChainContext obtainProtocolChainContext(
325
329
326
330
private static void addHostHeader (final Request request ,
327
331
final URI uri ,
328
- final HttpRequestPacket . Builder builder ) {
332
+ final HttpRequestPacket requestPacket ) {
329
333
String host = request .getVirtualHost ();
330
334
if (host != null ) {
331
- builder . header (Header .Host , host );
335
+ requestPacket . addHeader (Header .Host , host );
332
336
} else {
333
337
if (uri .getPort () == -1 ) {
334
- builder . header (Header .Host , uri .getHost ());
338
+ requestPacket . addHeader (Header .Host , uri .getHost ());
335
339
} else {
336
- builder . header (Header .Host , uri .getHost () + ':' + uri .getPort ());
340
+ requestPacket . addHeader (Header .Host , uri .getHost () + ':' + uri .getPort ());
337
341
}
338
342
}
339
343
}
@@ -479,4 +483,25 @@ public void getBytes(byte[] bytes) {
479
483
}
480
484
481
485
} // END GrizzlyTransferAdapter
486
+
487
+
488
+ class HttpRequestPacketImpl extends HttpRequestPacket {
489
+
490
+ private ProcessingState processingState = new ProcessingState ();
491
+
492
+ // -------------------------------------- Methods from HttpRequestPacketImpl
493
+
494
+
495
+ @ Override
496
+ public ProcessingState getProcessingState () {
497
+ return processingState ;
498
+ }
499
+
500
+ @ Override
501
+ public void recycle () {
502
+ super .recycle ();
503
+ processingState .recycle ();
504
+ requestCache .add (this );
505
+ }
506
+ }
482
507
}
0 commit comments