9
9
10
10
package org .elasticsearch .http .netty4 ;
11
11
12
- import io .netty .buffer .Unpooled ;
13
- import io .netty .handler .codec .http .DefaultFullHttpRequest ;
14
- import io .netty .handler .codec .http .EmptyHttpHeaders ;
15
- import io .netty .handler .codec .http .FullHttpRequest ;
12
+ import io .netty .handler .codec .http .DefaultHttpRequest ;
16
13
import io .netty .handler .codec .http .HttpHeaderNames ;
17
14
import io .netty .handler .codec .http .HttpHeaders ;
18
15
import io .netty .handler .codec .http .HttpMethod ;
16
+ import io .netty .handler .codec .http .HttpUtil ;
19
17
import io .netty .handler .codec .http .QueryStringDecoder ;
20
18
import io .netty .handler .codec .http .cookie .Cookie ;
21
19
import io .netty .handler .codec .http .cookie .ServerCookieDecoder ;
28
26
import org .elasticsearch .rest .ChunkedRestResponseBodyPart ;
29
27
import org .elasticsearch .rest .RestRequest ;
30
28
import org .elasticsearch .rest .RestStatus ;
31
- import org .elasticsearch .transport .netty4 .Netty4Utils ;
32
29
33
30
import java .util .AbstractMap ;
34
31
import java .util .Collection ;
41
38
42
39
public class Netty4HttpRequest implements HttpRequest {
43
40
44
- private final FullHttpRequest request ;
45
- private final HttpBody content ;
41
+ private final int sequence ;
42
+ private final io .netty .handler .codec .http .HttpRequest nettyRequest ;
43
+ private boolean hasContent ;
44
+ private HttpBody content ;
46
45
private final Map <String , List <String >> headers ;
47
46
private final AtomicBoolean released ;
48
47
private final Exception inboundException ;
49
- private final boolean pooled ;
50
- private final int sequence ;
51
48
private final QueryStringDecoder queryStringDecoder ;
52
49
53
- Netty4HttpRequest (int sequence , io .netty .handler .codec .http .HttpRequest request , Netty4HttpRequestBodyStream contentStream ) {
54
- this (
55
- sequence ,
56
- new DefaultFullHttpRequest (
57
- request .protocolVersion (),
58
- request .method (),
59
- request .uri (),
60
- Unpooled .EMPTY_BUFFER ,
61
- request .headers (),
62
- EmptyHttpHeaders .INSTANCE
63
- ),
64
- new AtomicBoolean (false ),
65
- true ,
66
- contentStream ,
67
- null
68
- );
69
- }
70
-
71
- Netty4HttpRequest (int sequence , FullHttpRequest request ) {
72
- this (sequence , request , new AtomicBoolean (false ), true , Netty4Utils .fullHttpBodyFrom (request .content ()));
50
+ public Netty4HttpRequest (int sequence , io .netty .handler .codec .http .HttpRequest nettyRequest , Exception exception ) {
51
+ this (sequence , nettyRequest , HttpBody .empty (), new AtomicBoolean (false ), exception );
73
52
}
74
53
75
- Netty4HttpRequest (int sequence , FullHttpRequest request , Exception inboundException ) {
76
- this (sequence , request , new AtomicBoolean (false ), true , Netty4Utils .fullHttpBodyFrom (request .content ()), inboundException );
77
- }
78
-
79
- private Netty4HttpRequest (int sequence , FullHttpRequest request , AtomicBoolean released , boolean pooled , HttpBody content ) {
80
- this (sequence , request , released , pooled , content , null );
54
+ public Netty4HttpRequest (int sequence , io .netty .handler .codec .http .HttpRequest nettyRequest , HttpBody content ) {
55
+ this (sequence , nettyRequest , content , new AtomicBoolean (false ), null );
81
56
}
82
57
83
58
private Netty4HttpRequest (
84
59
int sequence ,
85
- FullHttpRequest request ,
86
- AtomicBoolean released ,
87
- boolean pooled ,
60
+ io .netty .handler .codec .http .HttpRequest nettyRequest ,
88
61
HttpBody content ,
62
+ AtomicBoolean released ,
89
63
Exception inboundException
90
64
) {
91
65
this .sequence = sequence ;
92
- this .request = request ;
93
- this .headers = getHttpHeadersAsMap ( request . headers () );
66
+ this .nettyRequest = nettyRequest ;
67
+ this .hasContent = hasContentHeader ( nettyRequest );
94
68
this .content = content ;
95
- this .pooled = pooled ;
69
+ this .headers = getHttpHeadersAsMap ( nettyRequest . headers ()) ;
96
70
this .released = released ;
97
71
this .inboundException = inboundException ;
98
- this .queryStringDecoder = new QueryStringDecoder (request .uri ());
72
+ this .queryStringDecoder = new QueryStringDecoder (nettyRequest .uri ());
73
+ }
74
+
75
+ private static boolean hasContentHeader (io .netty .handler .codec .http .HttpRequest nettyRequest ) {
76
+ return HttpUtil .isTransferEncodingChunked (nettyRequest ) || HttpUtil .getContentLength (nettyRequest , 0L ) > 0 ;
77
+ }
78
+
79
+ @ Override
80
+ public boolean hasContent () {
81
+ return hasContent ;
99
82
}
100
83
101
84
@ Override
102
85
public RestRequest .Method method () {
103
- return translateRequestMethod (request .method ());
86
+ return translateRequestMethod (nettyRequest .method ());
104
87
}
105
88
106
89
@ Override
107
90
public String uri () {
108
- return request .uri ();
91
+ return nettyRequest .uri ();
109
92
}
110
93
111
94
@ Override
@@ -119,10 +102,17 @@ public HttpBody body() {
119
102
return content ;
120
103
}
121
104
105
+ @ Override
106
+ public void setBody (HttpBody body ) {
107
+ assert this .content .isStream () : "only stream content can be replaced" ;
108
+ assert body .isFull () : "only full content can replace stream" ;
109
+ this .content = body ;
110
+ this .hasContent = body .isEmpty () == false ;
111
+ }
112
+
122
113
@ Override
123
114
public void release () {
124
- if (pooled && released .compareAndSet (false , true )) {
125
- request .release ();
115
+ if (released .compareAndSet (false , true )) {
126
116
content .close ();
127
117
}
128
118
}
@@ -134,7 +124,7 @@ public final Map<String, List<String>> getHeaders() {
134
124
135
125
@ Override
136
126
public List <String > strictCookies () {
137
- String cookieString = request .headers ().get (HttpHeaderNames .COOKIE );
127
+ String cookieString = nettyRequest .headers ().get (HttpHeaderNames .COOKIE );
138
128
if (cookieString != null ) {
139
129
Set <Cookie > cookies = ServerCookieDecoder .STRICT .decode (cookieString );
140
130
if (cookies .isEmpty () == false ) {
@@ -146,40 +136,36 @@ public List<String> strictCookies() {
146
136
147
137
@ Override
148
138
public HttpVersion protocolVersion () {
149
- if (request .protocolVersion ().equals (io .netty .handler .codec .http .HttpVersion .HTTP_1_0 )) {
150
- return HttpRequest . HttpVersion .HTTP_1_0 ;
151
- } else if (request .protocolVersion ().equals (io .netty .handler .codec .http .HttpVersion .HTTP_1_1 )) {
152
- return HttpRequest . HttpVersion .HTTP_1_1 ;
139
+ if (nettyRequest .protocolVersion ().equals (io .netty .handler .codec .http .HttpVersion .HTTP_1_0 )) {
140
+ return HttpVersion .HTTP_1_0 ;
141
+ } else if (nettyRequest .protocolVersion ().equals (io .netty .handler .codec .http .HttpVersion .HTTP_1_1 )) {
142
+ return HttpVersion .HTTP_1_1 ;
153
143
} else {
154
- throw new IllegalArgumentException ("Unexpected http protocol version: " + request .protocolVersion ());
144
+ throw new IllegalArgumentException ("Unexpected http protocol version: " + nettyRequest .protocolVersion ());
155
145
}
156
146
}
157
147
158
148
@ Override
159
149
public HttpRequest removeHeader (String header ) {
160
- HttpHeaders copiedHeadersWithout = request .headers ().copy ();
150
+ HttpHeaders copiedHeadersWithout = nettyRequest .headers ().copy ();
161
151
copiedHeadersWithout .remove (header );
162
- HttpHeaders copiedTrailingHeadersWithout = request .trailingHeaders ().copy ();
163
- copiedTrailingHeadersWithout .remove (header );
164
- FullHttpRequest requestWithoutHeader = new DefaultFullHttpRequest (
165
- request .protocolVersion (),
166
- request .method (),
167
- request .uri (),
168
- request .content (),
169
- copiedHeadersWithout ,
170
- copiedTrailingHeadersWithout
152
+ var requestWithoutHeader = new DefaultHttpRequest (
153
+ nettyRequest .protocolVersion (),
154
+ nettyRequest .method (),
155
+ nettyRequest .uri (),
156
+ copiedHeadersWithout
171
157
);
172
- return new Netty4HttpRequest (sequence , requestWithoutHeader , released , pooled , content );
158
+ return new Netty4HttpRequest (sequence , requestWithoutHeader , content , released , null );
173
159
}
174
160
175
161
@ Override
176
162
public Netty4FullHttpResponse createResponse (RestStatus status , BytesReference contentRef ) {
177
- return new Netty4FullHttpResponse (sequence , request .protocolVersion (), status , contentRef );
163
+ return new Netty4FullHttpResponse (sequence , nettyRequest .protocolVersion (), status , contentRef );
178
164
}
179
165
180
166
@ Override
181
167
public HttpResponse createResponse (RestStatus status , ChunkedRestResponseBodyPart firstBodyPart ) {
182
- return new Netty4ChunkedHttpResponse (sequence , request .protocolVersion (), status , firstBodyPart );
168
+ return new Netty4ChunkedHttpResponse (sequence , nettyRequest .protocolVersion (), status , firstBodyPart );
183
169
}
184
170
185
171
@ Override
@@ -188,7 +174,7 @@ public Exception getInboundException() {
188
174
}
189
175
190
176
public io .netty .handler .codec .http .HttpRequest getNettyRequest () {
191
- return request ;
177
+ return nettyRequest ;
192
178
}
193
179
194
180
public static RestRequest .Method translateRequestMethod (HttpMethod httpMethod ) {
0 commit comments