30 import java.net.http.HttpHeaders; |
30 import java.net.http.HttpHeaders; |
31 import java.net.http.HttpRequest; |
31 import java.net.http.HttpRequest; |
32 import java.net.http.HttpResponse; |
32 import java.net.http.HttpResponse; |
33 import java.net.http.HttpResponse.BodyHandlers; |
33 import java.net.http.HttpResponse.BodyHandlers; |
34 import java.net.http.WebSocketHandshakeException; |
34 import java.net.http.WebSocketHandshakeException; |
|
35 |
|
36 import jdk.internal.net.http.HttpRequestBuilderImpl; |
|
37 import jdk.internal.net.http.HttpRequestImpl; |
35 import jdk.internal.net.http.common.MinimalFuture; |
38 import jdk.internal.net.http.common.MinimalFuture; |
36 import jdk.internal.net.http.common.Pair; |
39 import jdk.internal.net.http.common.Pair; |
37 import jdk.internal.net.http.common.Utils; |
40 import jdk.internal.net.http.common.Utils; |
38 |
41 |
39 import java.io.IOException; |
42 import java.io.IOException; |
102 // implementation |
105 // implementation |
103 throw new InternalError("Minimum requirements", e); |
106 throw new InternalError("Minimum requirements", e); |
104 } |
107 } |
105 } |
108 } |
106 |
109 |
107 private final HttpRequest request; |
110 private final HttpRequestImpl request; |
108 private final Collection<String> subprotocols; |
111 private final Collection<String> subprotocols; |
109 private final String nonce; |
112 private final String nonce; |
110 |
113 |
111 public OpeningHandshake(BuilderImpl b) { |
114 public OpeningHandshake(BuilderImpl b) { |
112 checkURI(b.getUri()); |
115 checkURI(b.getUri()); |
113 Proxy proxy = proxyFor(b.getProxySelector(), b.getUri()); |
116 Proxy proxy = proxyFor(b.getProxySelector(), b.getUri()); |
114 checkPermissions(b, proxy); |
117 checkPermissions(b, proxy); |
115 this.client = b.getClient(); |
118 this.client = b.getClient(); |
116 URI httpURI = createRequestURI(b.getUri()); |
119 URI httpURI = createRequestURI(b.getUri()); |
117 HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(httpURI); |
120 HttpRequestBuilderImpl requestBuilder = new HttpRequestBuilderImpl(httpURI); |
118 Duration connectTimeout = b.getConnectTimeout(); |
121 Duration connectTimeout = b.getConnectTimeout(); |
119 if (connectTimeout != null) { |
122 if (connectTimeout != null) { |
120 requestBuilder.timeout(connectTimeout); |
123 requestBuilder.timeout(connectTimeout); |
121 } |
124 } |
122 for (Pair<String, String> p : b.getHeaders()) { |
125 for (Pair<String, String> p : b.getHeaders()) { |
135 requestBuilder.header(HEADER_KEY, this.nonce); |
138 requestBuilder.header(HEADER_KEY, this.nonce); |
136 // Setting request version to HTTP/1.1 forcibly, since it's not possible |
139 // Setting request version to HTTP/1.1 forcibly, since it's not possible |
137 // to upgrade from HTTP/2 to WebSocket (as of August 2016): |
140 // to upgrade from HTTP/2 to WebSocket (as of August 2016): |
138 // |
141 // |
139 // https://tools.ietf.org/html/draft-hirano-httpbis-websocket-over-http2-00 |
142 // https://tools.ietf.org/html/draft-hirano-httpbis-websocket-over-http2-00 |
140 this.request = requestBuilder.version(Version.HTTP_1_1).GET().build(); |
143 requestBuilder.version(Version.HTTP_1_1).GET(); |
141 WebSocketRequest r = (WebSocketRequest) this.request; |
144 request = requestBuilder.buildForWebSocket(); |
142 r.isWebSocket(true); |
145 request.isWebSocket(true); |
143 r.setSystemHeader(HEADER_UPGRADE, "websocket"); |
146 request.setSystemHeader(HEADER_UPGRADE, "websocket"); |
144 r.setSystemHeader(HEADER_CONNECTION, "Upgrade"); |
147 request.setSystemHeader(HEADER_CONNECTION, "Upgrade"); |
145 r.setProxy(proxy); |
148 request.setProxy(proxy); |
146 } |
149 } |
147 |
150 |
148 private static Collection<String> createRequestSubprotocols( |
151 private static Collection<String> createRequestSubprotocols( |
149 Collection<String> subprotocols) |
152 Collection<String> subprotocols) |
150 { |
153 { |