19
19
20
20
package org .elasticsearch .http .nio ;
21
21
22
+ import io .netty .buffer .ByteBuf ;
23
+ import io .netty .buffer .Unpooled ;
22
24
import io .netty .handler .codec .http .DefaultFullHttpRequest ;
23
25
import io .netty .handler .codec .http .DefaultHttpHeaders ;
24
26
import io .netty .handler .codec .http .FullHttpRequest ;
28
30
import io .netty .handler .codec .http .cookie .Cookie ;
29
31
import io .netty .handler .codec .http .cookie .ServerCookieDecoder ;
30
32
import io .netty .handler .codec .http .cookie .ServerCookieEncoder ;
31
- import org .elasticsearch .common .bytes .BytesArray ;
32
33
import org .elasticsearch .common .bytes .BytesReference ;
33
34
import org .elasticsearch .http .HttpRequest ;
34
35
import org .elasticsearch .rest .RestRequest ;
40
41
import java .util .List ;
41
42
import java .util .Map ;
42
43
import java .util .Set ;
44
+ import java .util .concurrent .atomic .AtomicBoolean ;
43
45
import java .util .stream .Collectors ;
44
46
45
47
public class NioHttpRequest implements HttpRequest {
@@ -48,16 +50,22 @@ public class NioHttpRequest implements HttpRequest {
48
50
private final BytesReference content ;
49
51
private final HttpHeadersMap headers ;
50
52
private final int sequence ;
53
+ private final AtomicBoolean released ;
54
+ private final boolean pooled ;
51
55
52
56
NioHttpRequest (FullHttpRequest request , int sequence ) {
57
+ this (request , new HttpHeadersMap (request .headers ()), sequence , new AtomicBoolean (false ), true ,
58
+ ByteBufUtils .toBytesReference (request .content ()));
59
+ }
60
+
61
+ private NioHttpRequest (FullHttpRequest request , HttpHeadersMap headers , int sequence , AtomicBoolean released , boolean pooled ,
62
+ BytesReference content ) {
53
63
this .request = request ;
54
- headers = new HttpHeadersMap (request .headers ());
55
64
this .sequence = sequence ;
56
- if (request .content ().isReadable ()) {
57
- this .content = ByteBufUtils .toBytesReference (request .content ());
58
- } else {
59
- this .content = BytesArray .EMPTY ;
60
- }
65
+ this .headers = headers ;
66
+ this .content = content ;
67
+ this .pooled = pooled ;
68
+ this .released = released ;
61
69
}
62
70
63
71
@ Override
@@ -105,17 +113,32 @@ public String uri() {
105
113
106
114
@ Override
107
115
public BytesReference content () {
116
+ assert released .get () == false ;
108
117
return content ;
109
118
}
110
119
111
120
@ Override
112
121
public void release () {
113
- // NioHttpRequest works from copied unpooled bytes no need to release anything
122
+ if (pooled && released .compareAndSet (false , true )) {
123
+ request .release ();
124
+ }
114
125
}
115
126
116
127
@ Override
117
128
public HttpRequest releaseAndCopy () {
118
- return this ;
129
+ assert released .get () == false ;
130
+ if (pooled == false ) {
131
+ return this ;
132
+ }
133
+ try {
134
+ final ByteBuf copiedContent = Unpooled .copiedBuffer (request .content ());
135
+ return new NioHttpRequest (
136
+ new DefaultFullHttpRequest (request .protocolVersion (), request .method (), request .uri (), copiedContent , request .headers (),
137
+ request .trailingHeaders ()),
138
+ headers , sequence , new AtomicBoolean (false ), false , ByteBufUtils .toBytesReference (copiedContent ));
139
+ } finally {
140
+ release ();
141
+ }
119
142
}
120
143
121
144
@ Override
@@ -156,7 +179,8 @@ public HttpRequest removeHeader(String header) {
156
179
trailingHeaders .remove (header );
157
180
FullHttpRequest requestWithoutHeader = new DefaultFullHttpRequest (request .protocolVersion (), request .method (), request .uri (),
158
181
request .content (), headersWithoutContentTypeHeader , trailingHeaders );
159
- return new NioHttpRequest (requestWithoutHeader , sequence );
182
+ return new NioHttpRequest (requestWithoutHeader , new HttpHeadersMap (requestWithoutHeader .headers ()), sequence , released ,
183
+ pooled , content );
160
184
}
161
185
162
186
@ Override
0 commit comments