8158651: ConcurrentModification exceptions in httpclient

Reviewed-by: rriggs
This commit is contained in:
Michael McMahon 2016-06-03 16:28:53 +01:00
parent 05e9b6b110
commit b1c5f2dfdd
2 changed files with 7 additions and 7 deletions
jdk/src/java.httpclient/share/classes/java/net/http

@ -367,7 +367,7 @@ class Http2Connection implements BufferHandler {
Log.logError(t); Log.logError(t);
closed = true; closed = true;
client2.deleteConnection(this); client2.deleteConnection(this);
Collection<Stream> c = streams.values(); List<Stream> c = new LinkedList<>(streams.values());
for (Stream s : c) { for (Stream s : c) {
s.cancelImpl(t); s.cancelImpl(t);
} }

@ -30,6 +30,7 @@ import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionException;
@ -537,7 +538,7 @@ class Stream extends ExchangeImpl {
* getResponseAsync() * getResponseAsync()
*/ */
final List<CompletableFuture<HttpResponseImpl>> response_cfs = new LinkedList<>(); final List<CompletableFuture<HttpResponseImpl>> response_cfs = new ArrayList<>(5);
@Override @Override
CompletableFuture<HttpResponseImpl> getResponseAsync(Void v) { CompletableFuture<HttpResponseImpl> getResponseAsync(Void v) {
@ -565,17 +566,16 @@ class Stream extends ExchangeImpl {
void completeResponse(HttpResponse r) { void completeResponse(HttpResponse r) {
HttpResponseImpl resp = (HttpResponseImpl)r; HttpResponseImpl resp = (HttpResponseImpl)r;
synchronized (response_cfs) { synchronized (response_cfs) {
for (CompletableFuture<HttpResponseImpl> cf : response_cfs) { int cfs_len = response_cfs.size();
for (int i=0; i<cfs_len; i++) {
CompletableFuture<HttpResponseImpl> cf = response_cfs.get(i);
if (!cf.isDone()) { if (!cf.isDone()) {
cf.complete(resp); cf.complete(resp);
response_cfs.remove(cf); response_cfs.remove(cf);
//responseHeaders = new HttpHeadersImpl(); // for any following header blocks
return; return;
} else }
System.err.println("Stream: " + this + " ALREADY DONE");
} }
response_cfs.add(CompletableFuture.completedFuture(resp)); response_cfs.add(CompletableFuture.completedFuture(resp));
//responseHeaders = new HttpHeadersImpl(); // for any following header blocks
} }
} }