11
11
import io .netty .buffer .ByteBuf ;
12
12
import io .netty .buffer .Unpooled ;
13
13
import io .netty .handler .codec .http .DefaultFullHttpRequest ;
14
- import io .netty .handler .codec .http .DefaultHttpHeaders ;
15
14
import io .netty .handler .codec .http .FullHttpRequest ;
16
15
import io .netty .handler .codec .http .HttpHeaderNames ;
17
16
import io .netty .handler .codec .http .HttpHeaders ;
@@ -41,59 +40,35 @@ public class Netty4HttpRequest implements HttpRequest {
41
40
42
41
private final FullHttpRequest request ;
43
42
private final BytesReference content ;
44
- private final HttpHeadersMap headers ;
43
+ private final Map < String , List < String >> headers ;
45
44
private final AtomicBoolean released ;
46
45
private final Exception inboundException ;
47
46
private final boolean pooled ;
48
-
49
47
private final int sequence ;
50
48
51
49
Netty4HttpRequest (int sequence , FullHttpRequest request ) {
52
- this (
53
- sequence ,
54
- request ,
55
- new HttpHeadersMap (request .headers ()),
56
- new AtomicBoolean (false ),
57
- true ,
58
- Netty4Utils .toBytesReference (request .content ())
59
- );
50
+ this (sequence , request , new AtomicBoolean (false ), true , Netty4Utils .toBytesReference (request .content ()));
60
51
}
61
52
62
53
Netty4HttpRequest (int sequence , FullHttpRequest request , Exception inboundException ) {
63
- this (
64
- sequence ,
65
- request ,
66
- new HttpHeadersMap (request .headers ()),
67
- new AtomicBoolean (false ),
68
- true ,
69
- Netty4Utils .toBytesReference (request .content ()),
70
- inboundException
71
- );
54
+ this (sequence , request , new AtomicBoolean (false ), true , Netty4Utils .toBytesReference (request .content ()), inboundException );
72
55
}
73
56
74
- private Netty4HttpRequest (
75
- int sequence ,
76
- FullHttpRequest request ,
77
- HttpHeadersMap headers ,
78
- AtomicBoolean released ,
79
- boolean pooled ,
80
- BytesReference content
81
- ) {
82
- this (sequence , request , headers , released , pooled , content , null );
57
+ private Netty4HttpRequest (int sequence , FullHttpRequest request , AtomicBoolean released , boolean pooled , BytesReference content ) {
58
+ this (sequence , request , released , pooled , content , null );
83
59
}
84
60
85
61
private Netty4HttpRequest (
86
62
int sequence ,
87
63
FullHttpRequest request ,
88
- HttpHeadersMap headers ,
89
64
AtomicBoolean released ,
90
65
boolean pooled ,
91
66
BytesReference content ,
92
67
Exception inboundException
93
68
) {
94
69
this .sequence = sequence ;
95
70
this .request = request ;
96
- this .headers = headers ;
71
+ this .headers = getHttpHeadersAsMap ( request . headers ()) ;
97
72
this .content = content ;
98
73
this .pooled = pooled ;
99
74
this .released = released ;
@@ -102,36 +77,7 @@ private Netty4HttpRequest(
102
77
103
78
@ Override
104
79
public RestRequest .Method method () {
105
- HttpMethod httpMethod = request .method ();
106
- if (httpMethod == HttpMethod .GET ) return RestRequest .Method .GET ;
107
-
108
- if (httpMethod == HttpMethod .POST ) return RestRequest .Method .POST ;
109
-
110
- if (httpMethod == HttpMethod .PUT ) return RestRequest .Method .PUT ;
111
-
112
- if (httpMethod == HttpMethod .DELETE ) return RestRequest .Method .DELETE ;
113
-
114
- if (httpMethod == HttpMethod .HEAD ) {
115
- return RestRequest .Method .HEAD ;
116
- }
117
-
118
- if (httpMethod == HttpMethod .OPTIONS ) {
119
- return RestRequest .Method .OPTIONS ;
120
- }
121
-
122
- if (httpMethod == HttpMethod .PATCH ) {
123
- return RestRequest .Method .PATCH ;
124
- }
125
-
126
- if (httpMethod == HttpMethod .TRACE ) {
127
- return RestRequest .Method .TRACE ;
128
- }
129
-
130
- if (httpMethod == HttpMethod .CONNECT ) {
131
- return RestRequest .Method .CONNECT ;
132
- }
133
-
134
- throw new IllegalArgumentException ("Unexpected http method: " + httpMethod );
80
+ return translateRequestMethod (request .method ());
135
81
}
136
82
137
83
@ Override
@@ -170,7 +116,6 @@ public HttpRequest releaseAndCopy() {
170
116
request .headers (),
171
117
request .trailingHeaders ()
172
118
),
173
- headers ,
174
119
new AtomicBoolean (false ),
175
120
false ,
176
121
Netty4Utils .toBytesReference (copiedContent )
@@ -210,28 +155,19 @@ public HttpVersion protocolVersion() {
210
155
211
156
@ Override
212
157
public HttpRequest removeHeader (String header ) {
213
- HttpHeaders headersWithoutContentTypeHeader = new DefaultHttpHeaders ();
214
- headersWithoutContentTypeHeader .add (request .headers ());
215
- headersWithoutContentTypeHeader .remove (header );
216
- HttpHeaders trailingHeaders = new DefaultHttpHeaders ();
217
- trailingHeaders .add (request .trailingHeaders ());
218
- trailingHeaders .remove (header );
158
+ HttpHeaders copiedHeadersWithout = request .headers ().copy ();
159
+ copiedHeadersWithout .remove (header );
160
+ HttpHeaders copiedTrailingHeadersWithout = request .trailingHeaders ().copy ();
161
+ copiedTrailingHeadersWithout .remove (header );
219
162
FullHttpRequest requestWithoutHeader = new DefaultFullHttpRequest (
220
163
request .protocolVersion (),
221
164
request .method (),
222
165
request .uri (),
223
166
request .content (),
224
- headersWithoutContentTypeHeader ,
225
- trailingHeaders
226
- );
227
- return new Netty4HttpRequest (
228
- sequence ,
229
- requestWithoutHeader ,
230
- new HttpHeadersMap (requestWithoutHeader .headers ()),
231
- released ,
232
- pooled ,
233
- content
167
+ copiedHeadersWithout ,
168
+ copiedTrailingHeadersWithout
234
169
);
170
+ return new Netty4HttpRequest (sequence , requestWithoutHeader , released , pooled , content );
235
171
}
236
172
237
173
@ Override
@@ -249,6 +185,46 @@ public Exception getInboundException() {
249
185
return inboundException ;
250
186
}
251
187
188
+ public io .netty .handler .codec .http .HttpRequest getNettyRequest () {
189
+ return request ;
190
+ }
191
+
192
+ public static RestRequest .Method translateRequestMethod (HttpMethod httpMethod ) {
193
+ if (httpMethod == HttpMethod .GET ) return RestRequest .Method .GET ;
194
+
195
+ if (httpMethod == HttpMethod .POST ) return RestRequest .Method .POST ;
196
+
197
+ if (httpMethod == HttpMethod .PUT ) return RestRequest .Method .PUT ;
198
+
199
+ if (httpMethod == HttpMethod .DELETE ) return RestRequest .Method .DELETE ;
200
+
201
+ if (httpMethod == HttpMethod .HEAD ) {
202
+ return RestRequest .Method .HEAD ;
203
+ }
204
+
205
+ if (httpMethod == HttpMethod .OPTIONS ) {
206
+ return RestRequest .Method .OPTIONS ;
207
+ }
208
+
209
+ if (httpMethod == HttpMethod .PATCH ) {
210
+ return RestRequest .Method .PATCH ;
211
+ }
212
+
213
+ if (httpMethod == HttpMethod .TRACE ) {
214
+ return RestRequest .Method .TRACE ;
215
+ }
216
+
217
+ if (httpMethod == HttpMethod .CONNECT ) {
218
+ return RestRequest .Method .CONNECT ;
219
+ }
220
+
221
+ throw new IllegalArgumentException ("Unexpected http method: " + httpMethod );
222
+ }
223
+
224
+ public static Map <String , List <String >> getHttpHeadersAsMap (HttpHeaders httpHeaders ) {
225
+ return new HttpHeadersMap (httpHeaders );
226
+ }
227
+
252
228
/**
253
229
* A wrapper of {@link HttpHeaders} that implements a map to prevent copying unnecessarily. This class does not support modifications
254
230
* and due to the underlying implementation, it performs case insensitive lookups of key to values.
0 commit comments