30
30
import java .nio .ByteBuffer ;
31
31
import java .util .List ;
32
32
import java .util .concurrent .atomic .AtomicBoolean ;
33
+ import java .util .concurrent .atomic .AtomicReference ;
33
34
34
35
import org .apache .hc .core5 .http .EntityDetails ;
35
36
import org .apache .hc .core5 .http .Header ;
@@ -65,13 +66,12 @@ class ClientH2StreamHandler implements H2StreamHandler {
65
66
private final AsyncClientExchangeHandler exchangeHandler ;
66
67
private final HandlerFactory <AsyncPushConsumer > pushHandlerFactory ;
67
68
private final HttpCoreContext context ;
69
+ private final AtomicReference <MessageState > requestState ;
70
+ private final AtomicReference <MessageState > responseState ;
68
71
private final AtomicBoolean requestCommitted ;
69
72
private final AtomicBoolean failed ;
70
73
private final AtomicBoolean done ;
71
74
72
- private volatile MessageState requestState ;
73
- private volatile MessageState responseState ;
74
-
75
75
ClientH2StreamHandler (
76
76
final H2StreamChannel outputChannel ,
77
77
final HttpProcessor httpProcessor ,
@@ -95,13 +95,13 @@ public int write(final ByteBuffer src) throws IOException {
95
95
@ Override
96
96
public void endStream (final List <? extends Header > trailers ) throws IOException {
97
97
outputChannel .endStream (trailers );
98
- requestState = MessageState .COMPLETE ;
98
+ requestState . set ( MessageState .COMPLETE ) ;
99
99
}
100
100
101
101
@ Override
102
102
public void endStream () throws IOException {
103
103
outputChannel .endStream ();
104
- requestState = MessageState .COMPLETE ;
104
+ requestState . set ( MessageState .COMPLETE ) ;
105
105
}
106
106
107
107
};
@@ -113,8 +113,8 @@ public void endStream() throws IOException {
113
113
this .requestCommitted = new AtomicBoolean ();
114
114
this .failed = new AtomicBoolean ();
115
115
this .done = new AtomicBoolean ();
116
- this .requestState = MessageState .HEADERS ;
117
- this .responseState = MessageState .HEADERS ;
116
+ this .requestState = new AtomicReference <>( MessageState .HEADERS ) ;
117
+ this .responseState = new AtomicReference <>( MessageState .HEADERS ) ;
118
118
}
119
119
120
120
@ Override
@@ -124,7 +124,7 @@ public HandlerFactory<AsyncPushConsumer> getPushHandlerFactory() {
124
124
125
125
@ Override
126
126
public boolean isOutputReady () {
127
- switch (requestState ) {
127
+ switch (requestState . get () ) {
128
128
case HEADERS :
129
129
return true ;
130
130
case BODY :
@@ -146,14 +146,14 @@ private void commitRequest(final HttpRequest request, final EntityDetails entity
146
146
connMetrics .incrementRequestCount ();
147
147
148
148
if (entityDetails == null ) {
149
- requestState = MessageState .COMPLETE ;
149
+ requestState . set ( MessageState .COMPLETE ) ;
150
150
} else {
151
151
final Header h = request .getFirstHeader (HttpHeaders .EXPECT );
152
152
final boolean expectContinue = h != null && HeaderElements .CONTINUE .equalsIgnoreCase (h .getValue ());
153
153
if (expectContinue ) {
154
- requestState = MessageState .ACK ;
154
+ requestState . set ( MessageState .ACK ) ;
155
155
} else {
156
- requestState = MessageState .BODY ;
156
+ requestState . set ( MessageState .BODY ) ;
157
157
exchangeHandler .produce (dataChannel );
158
158
}
159
159
}
@@ -164,7 +164,7 @@ private void commitRequest(final HttpRequest request, final EntityDetails entity
164
164
165
165
@ Override
166
166
public void produceOutput () throws HttpException , IOException {
167
- switch (requestState ) {
167
+ switch (requestState . get () ) {
168
168
case HEADERS :
169
169
exchangeHandler .produceRequest ((request , entityDetails , httpContext ) -> commitRequest (request , entityDetails ), context );
170
170
break ;
@@ -184,7 +184,7 @@ public void consumeHeader(final List<Header> headers, final boolean endStream) t
184
184
if (done .get ()) {
185
185
throw new ProtocolException ("Unexpected message headers" );
186
186
}
187
- switch (responseState ) {
187
+ switch (responseState . get () ) {
188
188
case HEADERS :
189
189
final HttpResponse response = DefaultH2ResponseConverter .INSTANCE .convert (headers );
190
190
final int status = response .getCode ();
@@ -194,9 +194,9 @@ public void consumeHeader(final List<Header> headers, final boolean endStream) t
194
194
if (status > HttpStatus .SC_CONTINUE && status < HttpStatus .SC_SUCCESS ) {
195
195
exchangeHandler .consumeInformation (response , context );
196
196
}
197
- if (requestState == MessageState .ACK ) {
197
+ if (requestState . get () == MessageState .ACK ) {
198
198
if (status == HttpStatus .SC_CONTINUE || status >= HttpStatus .SC_SUCCESS ) {
199
- requestState = MessageState .BODY ;
199
+ requestState . set ( MessageState .BODY ) ;
200
200
exchangeHandler .produce (dataChannel );
201
201
}
202
202
}
@@ -210,10 +210,10 @@ public void consumeHeader(final List<Header> headers, final boolean endStream) t
210
210
connMetrics .incrementResponseCount ();
211
211
212
212
exchangeHandler .consumeResponse (response , entityDetails , context );
213
- responseState = endStream ? MessageState .COMPLETE : MessageState .BODY ;
213
+ responseState . set ( endStream ? MessageState .COMPLETE : MessageState .BODY ) ;
214
214
break ;
215
215
case BODY :
216
- responseState = MessageState .COMPLETE ;
216
+ responseState . set ( MessageState .COMPLETE ) ;
217
217
exchangeHandler .streamEnd (headers );
218
218
break ;
219
219
default :
@@ -228,14 +228,14 @@ public void updateInputCapacity() throws IOException {
228
228
229
229
@ Override
230
230
public void consumeData (final ByteBuffer src , final boolean endStream ) throws HttpException , IOException {
231
- if (done .get () || responseState != MessageState .BODY ) {
231
+ if (done .get () || responseState . get () != MessageState .BODY ) {
232
232
throw new ProtocolException ("Unexpected message data" );
233
233
}
234
234
if (src != null ) {
235
235
exchangeHandler .consume (src );
236
236
}
237
237
if (endStream ) {
238
- responseState = MessageState .COMPLETE ;
238
+ responseState . set ( MessageState .COMPLETE ) ;
239
239
exchangeHandler .streamEnd (null );
240
240
}
241
241
}
@@ -261,17 +261,17 @@ public void failed(final Exception cause) {
261
261
@ Override
262
262
public void releaseResources () {
263
263
if (done .compareAndSet (false , true )) {
264
- responseState = MessageState .COMPLETE ;
265
- requestState = MessageState .COMPLETE ;
264
+ responseState . set ( MessageState .COMPLETE ) ;
265
+ requestState . set ( MessageState .COMPLETE ) ;
266
266
exchangeHandler .releaseResources ();
267
267
}
268
268
}
269
269
270
270
@ Override
271
271
public String toString () {
272
272
return "[" +
273
- "requestState=" + requestState +
274
- ", responseState=" + responseState +
273
+ "requestState=" + requestState . get () +
274
+ ", responseState=" + responseState . get () +
275
275
']' ;
276
276
}
277
277
0 commit comments