@@ -131,6 +131,7 @@ public class RestClient implements Closeable {
131
131
private volatile NodeTuple <List <Node >> nodeTuple ;
132
132
private final WarningsHandler warningsHandler ;
133
133
private final boolean compressionEnabled ;
134
+ private final boolean chunkedTransferEncodingEnabled ;
134
135
135
136
RestClient (
136
137
CloseableHttpAsyncClient client ,
@@ -141,6 +142,20 @@ public class RestClient implements Closeable {
141
142
NodeSelector nodeSelector ,
142
143
boolean strictDeprecationMode ,
143
144
boolean compressionEnabled
145
+ ) {
146
+ this (client , defaultHeaders , nodes , pathPrefix , failureListener , nodeSelector , strictDeprecationMode , compressionEnabled , true );
147
+ }
148
+
149
+ RestClient (
150
+ CloseableHttpAsyncClient client ,
151
+ Header [] defaultHeaders ,
152
+ List <Node > nodes ,
153
+ String pathPrefix ,
154
+ FailureListener failureListener ,
155
+ NodeSelector nodeSelector ,
156
+ boolean strictDeprecationMode ,
157
+ boolean compressionEnabled ,
158
+ boolean chunkedTransferEncodingEnabled
144
159
) {
145
160
this .client = client ;
146
161
this .defaultHeaders = Collections .unmodifiableList (Arrays .asList (defaultHeaders ));
@@ -149,6 +164,7 @@ public class RestClient implements Closeable {
149
164
this .nodeSelector = nodeSelector ;
150
165
this .warningsHandler = strictDeprecationMode ? WarningsHandler .STRICT : WarningsHandler .PERMISSIVE ;
151
166
this .compressionEnabled = compressionEnabled ;
167
+ this .chunkedTransferEncodingEnabled = chunkedTransferEncodingEnabled ;
152
168
setNodes (nodes );
153
169
}
154
170
@@ -583,36 +599,51 @@ private static void addSuppressedException(Exception suppressedException, Except
583
599
}
584
600
}
585
601
586
- private static HttpRequestBase createHttpRequest (String method , URI uri , HttpEntity entity , boolean compressionEnabled ) {
602
+ private static HttpRequestBase createHttpRequest (
603
+ String method ,
604
+ URI uri ,
605
+ HttpEntity entity ,
606
+ boolean compressionEnabled ,
607
+ boolean chunkedTransferEncodingEnabled
608
+ ) {
587
609
switch (method .toUpperCase (Locale .ROOT )) {
588
610
case HttpDeleteWithEntity .METHOD_NAME :
589
- return addRequestBody (new HttpDeleteWithEntity (uri ), entity , compressionEnabled );
611
+ return addRequestBody (new HttpDeleteWithEntity (uri ), entity , compressionEnabled , chunkedTransferEncodingEnabled );
590
612
case HttpGetWithEntity .METHOD_NAME :
591
- return addRequestBody (new HttpGetWithEntity (uri ), entity , compressionEnabled );
613
+ return addRequestBody (new HttpGetWithEntity (uri ), entity , compressionEnabled , chunkedTransferEncodingEnabled );
592
614
case HttpHead .METHOD_NAME :
593
- return addRequestBody (new HttpHead (uri ), entity , compressionEnabled );
615
+ return addRequestBody (new HttpHead (uri ), entity , compressionEnabled , chunkedTransferEncodingEnabled );
594
616
case HttpOptions .METHOD_NAME :
595
- return addRequestBody (new HttpOptions (uri ), entity , compressionEnabled );
617
+ return addRequestBody (new HttpOptions (uri ), entity , compressionEnabled , chunkedTransferEncodingEnabled );
596
618
case HttpPatch .METHOD_NAME :
597
- return addRequestBody (new HttpPatch (uri ), entity , compressionEnabled );
619
+ return addRequestBody (new HttpPatch (uri ), entity , compressionEnabled , chunkedTransferEncodingEnabled );
598
620
case HttpPost .METHOD_NAME :
599
621
HttpPost httpPost = new HttpPost (uri );
600
- addRequestBody (httpPost , entity , compressionEnabled );
622
+ addRequestBody (httpPost , entity , compressionEnabled , chunkedTransferEncodingEnabled );
601
623
return httpPost ;
602
624
case HttpPut .METHOD_NAME :
603
- return addRequestBody (new HttpPut (uri ), entity , compressionEnabled );
625
+ return addRequestBody (new HttpPut (uri ), entity , compressionEnabled , chunkedTransferEncodingEnabled );
604
626
case HttpTrace .METHOD_NAME :
605
- return addRequestBody (new HttpTrace (uri ), entity , compressionEnabled );
627
+ return addRequestBody (new HttpTrace (uri ), entity , compressionEnabled , chunkedTransferEncodingEnabled );
606
628
default :
607
629
throw new UnsupportedOperationException ("http method not supported: " + method );
608
630
}
609
631
}
610
632
611
- private static HttpRequestBase addRequestBody (HttpRequestBase httpRequest , HttpEntity entity , boolean compressionEnabled ) {
633
+ private static HttpRequestBase addRequestBody (
634
+ HttpRequestBase httpRequest ,
635
+ HttpEntity entity ,
636
+ boolean compressionEnabled ,
637
+ boolean chunkedTransferEncodingEnabled
638
+ ) {
612
639
if (entity != null ) {
613
640
if (httpRequest instanceof HttpEntityEnclosingRequestBase ) {
614
641
if (compressionEnabled ) {
615
- entity = new ContentCompressingEntity (entity );
642
+ if (chunkedTransferEncodingEnabled ) {
643
+ entity = new ContentCompressingChunkedEntity (entity );
644
+ } else {
645
+ entity = new ContentCompressingEntity (entity );
646
+ }
616
647
}
617
648
((HttpEntityEnclosingRequestBase ) httpRequest ).setEntity (entity );
618
649
} else {
@@ -782,7 +813,13 @@ private class InternalRequest {
782
813
String ignoreString = params .remove ("ignore" );
783
814
this .ignoreErrorCodes = getIgnoreErrorCodes (ignoreString , request .getMethod ());
784
815
URI uri = buildUri (pathPrefix , request .getEndpoint (), params );
785
- this .httpRequest = createHttpRequest (request .getMethod (), uri , request .getEntity (), compressionEnabled );
816
+ this .httpRequest = createHttpRequest (
817
+ request .getMethod (),
818
+ uri ,
819
+ request .getEntity (),
820
+ compressionEnabled ,
821
+ chunkedTransferEncodingEnabled
822
+ );
786
823
this .cancellable = Cancellable .fromRequest (httpRequest );
787
824
setHeaders (httpRequest , request .getOptions ().getHeaders ());
788
825
setRequestConfig (httpRequest , request .getOptions ().getRequestConfig ());
@@ -932,6 +969,30 @@ private static Exception extractAndWrapCause(Exception exception) {
932
969
return new RuntimeException ("error while performing request" , exception );
933
970
}
934
971
972
+ /**
973
+ * A gzip compressing entity that also implements {@code getContent()}.
974
+ */
975
+ public static class ContentCompressingChunkedEntity extends GzipCompressingEntity {
976
+
977
+ /**
978
+ * Creates a {@link ContentCompressingChunkedEntity} instance with the provided HTTP entity.
979
+ *
980
+ * @param entity the HTTP entity.
981
+ */
982
+ public ContentCompressingChunkedEntity (HttpEntity entity ) {
983
+ super (entity );
984
+ }
985
+
986
+ @ Override
987
+ public InputStream getContent () throws IOException {
988
+ ByteArrayInputOutputStream out = new ByteArrayInputOutputStream (1024 );
989
+ try (GZIPOutputStream gzipOut = new GZIPOutputStream (out )) {
990
+ wrappedEntity .writeTo (gzipOut );
991
+ }
992
+ return out .asInput ();
993
+ }
994
+ }
995
+
935
996
/**
936
997
* A gzip compressing entity that also implements {@code getContent()}.
937
998
*/
0 commit comments