src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpRequestImpl.java
branchhttp-client-branch
changeset 55764 34d7cc00f87a
parent 55763 634d8e14c172
child 55800 c4307c12419d
equal deleted inserted replaced
55763:634d8e14c172 55764:34d7cc00f87a
    28 import jdk.incubator.http.internal.common.HttpHeadersImpl;
    28 import jdk.incubator.http.internal.common.HttpHeadersImpl;
    29 import jdk.incubator.http.internal.websocket.WebSocketRequest;
    29 import jdk.incubator.http.internal.websocket.WebSocketRequest;
    30 
    30 
    31 import java.io.IOException;
    31 import java.io.IOException;
    32 import java.net.InetSocketAddress;
    32 import java.net.InetSocketAddress;
       
    33 import java.net.Proxy;
    33 import java.net.ProxySelector;
    34 import java.net.ProxySelector;
    34 import java.net.URI;
    35 import java.net.URI;
    35 import java.security.AccessControlContext;
    36 import java.security.AccessControlContext;
    36 import java.security.AccessController;
    37 import java.security.AccessController;
    37 import java.security.PrivilegedAction;
    38 import java.security.PrivilegedAction;
    38 import java.time.Duration;
    39 import java.time.Duration;
       
    40 import java.util.List;
    39 import java.util.Locale;
    41 import java.util.Locale;
    40 import java.util.Optional;
    42 import java.util.Optional;
    41 
    43 
    42 import static jdk.incubator.http.internal.common.Utils.ALLOWED_HEADERS;
    44 import static jdk.incubator.http.internal.common.Utils.ALLOWED_HEADERS;
    43 
    45 
    44 class HttpRequestImpl extends HttpRequest implements WebSocketRequest {
    46 class HttpRequestImpl extends HttpRequest implements WebSocketRequest {
    45 
    47 
    46     private final HttpHeaders userHeaders;
    48     private final HttpHeaders userHeaders;
    47     private final HttpHeadersImpl systemHeaders;
    49     private final HttpHeadersImpl systemHeaders;
    48     private final URI uri;
    50     private final URI uri;
       
    51     private Proxy proxy;
    49     private InetSocketAddress authority; // only used when URI not specified
    52     private InetSocketAddress authority; // only used when URI not specified
    50     private final String method;
    53     private final String method;
    51     final BodyPublisher requestPublisher;
    54     final BodyPublisher requestPublisher;
    52     final boolean secure;
    55     final boolean secure;
    53     final boolean expectContinue;
    56     final boolean expectContinue;
    64         this.method = method == null ? "GET" : method;
    67         this.method = method == null ? "GET" : method;
    65         this.userHeaders = ImmutableHeaders.of(builder.headers().map(), ALLOWED_HEADERS);
    68         this.userHeaders = ImmutableHeaders.of(builder.headers().map(), ALLOWED_HEADERS);
    66         this.systemHeaders = new HttpHeadersImpl();
    69         this.systemHeaders = new HttpHeadersImpl();
    67         this.uri = builder.uri();
    70         this.uri = builder.uri();
    68         assert uri != null;
    71         assert uri != null;
       
    72         this.proxy = null;
    69         this.expectContinue = builder.expectContinue();
    73         this.expectContinue = builder.expectContinue();
    70         this.secure = uri.getScheme().toLowerCase(Locale.US).equals("https");
    74         this.secure = uri.getScheme().toLowerCase(Locale.US).equals("https");
    71         this.requestPublisher = builder.bodyPublisher();  // may be null
    75         this.requestPublisher = builder.bodyPublisher();  // may be null
    72         this.timeout = builder.timeout();
    76         this.timeout = builder.timeout();
    73         this.version = builder.version();
    77         this.version = builder.version();
    74     }
    78     }
    75 
    79 
    76     /**
    80     /**
    77      * Creates an HttpRequestImpl from the given request.
    81      * Creates an HttpRequestImpl from the given request.
    78      */
    82      */
    79     public HttpRequestImpl(HttpRequest request, AccessControlContext acc) {
    83     public HttpRequestImpl(HttpRequest request, ProxySelector ps, AccessControlContext acc) {
    80         String method = request.method();
    84         String method = request.method();
    81         this.method = method == null ? "GET" : method;
    85         this.method = method == null ? "GET" : method;
    82         this.userHeaders = request.headers();
    86         this.userHeaders = request.headers();
    83         if (request instanceof HttpRequestImpl) {
    87         if (request instanceof HttpRequestImpl) {
    84             this.systemHeaders = ((HttpRequestImpl) request).systemHeaders;
    88             this.systemHeaders = ((HttpRequestImpl) request).systemHeaders;
    85             this.isWebSocket = ((HttpRequestImpl) request).isWebSocket;
    89             this.isWebSocket = ((HttpRequestImpl) request).isWebSocket;
    86         } else {
    90         } else {
    87             this.systemHeaders = new HttpHeadersImpl();
    91             this.systemHeaders = new HttpHeadersImpl();
    88         }
    92         }
    89         this.uri = request.uri();
    93         this.uri = request.uri();
       
    94         if (isWebSocket) {
       
    95             // WebSocket determines and sets the proxy itself
       
    96             this.proxy = ((HttpRequestImpl) request).proxy;
       
    97         } else {
       
    98             if (ps != null)
       
    99                 this.proxy = retrieveProxy(ps, uri);
       
   100             else
       
   101                 this.proxy = null;
       
   102         }
    90         this.expectContinue = request.expectContinue();
   103         this.expectContinue = request.expectContinue();
    91         this.secure = uri.getScheme().toLowerCase(Locale.US).equals("https");
   104         this.secure = uri.getScheme().toLowerCase(Locale.US).equals("https");
    92         this.requestPublisher = request.bodyPublisher().orElse(null);
   105         this.requestPublisher = request.bodyPublisher().orElse(null);
    93         if (acc != null && requestPublisher instanceof RequestPublishers.FilePublisher) {
   106         if (acc != null && requestPublisher instanceof RequestPublishers.FilePublisher) {
    94             // Restricts the file publisher with the senders ACC, if any
   107             // Restricts the file publisher with the senders ACC, if any
   105         this.method = method == null? "GET" : method;
   118         this.method = method == null? "GET" : method;
   106         this.userHeaders = other.userHeaders;
   119         this.userHeaders = other.userHeaders;
   107         this.isWebSocket = other.isWebSocket;
   120         this.isWebSocket = other.isWebSocket;
   108         this.systemHeaders = other.systemHeaders;
   121         this.systemHeaders = other.systemHeaders;
   109         this.uri = uri;
   122         this.uri = uri;
       
   123         this.proxy = other.proxy;
   110         this.expectContinue = other.expectContinue;
   124         this.expectContinue = other.expectContinue;
   111         this.secure = uri.getScheme().toLowerCase(Locale.US).equals("https");
   125         this.secure = uri.getScheme().toLowerCase(Locale.US).equals("https");
   112         this.requestPublisher = other.requestPublisher;  // may be null
   126         this.requestPublisher = other.requestPublisher;  // may be null
   113         this.acc = other.acc;
   127         this.acc = other.acc;
   114         this.timeout = other.timeout;
   128         this.timeout = other.timeout;
   123         this.method = method;
   137         this.method = method;
   124         this.systemHeaders = new HttpHeadersImpl();
   138         this.systemHeaders = new HttpHeadersImpl();
   125         this.userHeaders = ImmutableHeaders.empty();
   139         this.userHeaders = ImmutableHeaders.empty();
   126         this.uri = URI.create("socket://" + authority.getHostString() + ":"
   140         this.uri = URI.create("socket://" + authority.getHostString() + ":"
   127                               + Integer.toString(authority.getPort()) + "/");
   141                               + Integer.toString(authority.getPort()) + "/");
       
   142         this.proxy = null;
   128         this.requestPublisher = null;
   143         this.requestPublisher = null;
   129         this.authority = authority;
   144         this.authority = authority;
   130         this.secure = false;
   145         this.secure = false;
   131         this.expectContinue = false;
   146         this.expectContinue = false;
   132         this.timeout = null;
   147         this.timeout = null;
   164         String authority = headers.firstValue(":authority")
   179         String authority = headers.firstValue(":authority")
   165                 .orElseThrow(() -> new IOException("No authority in Push Promise"));
   180                 .orElseThrow(() -> new IOException("No authority in Push Promise"));
   166         StringBuilder sb = new StringBuilder();
   181         StringBuilder sb = new StringBuilder();
   167         sb.append(scheme).append("://").append(authority).append(path);
   182         sb.append(scheme).append("://").append(authority).append(path);
   168         this.uri = URI.create(sb.toString());
   183         this.uri = URI.create(sb.toString());
   169 
   184         this.proxy = null;
   170         this.userHeaders = ImmutableHeaders.of(headers.map(), ALLOWED_HEADERS);
   185         this.userHeaders = ImmutableHeaders.of(headers.map(), ALLOWED_HEADERS);
   171         this.systemHeaders = parent.systemHeaders;
   186         this.systemHeaders = parent.systemHeaders;
   172         this.expectContinue = parent.expectContinue;
   187         this.expectContinue = parent.expectContinue;
   173         this.secure = parent.secure;
   188         this.secure = parent.secure;
   174         this.requestPublisher = parent.requestPublisher;
   189         this.requestPublisher = parent.requestPublisher;
   196     }
   211     }
   197 
   212 
   198     @Override
   213     @Override
   199     public boolean expectContinue() { return expectContinue; }
   214     public boolean expectContinue() { return expectContinue; }
   200 
   215 
   201     InetSocketAddress proxy(HttpClientImpl client) {
   216     /** Retrieves the proxy, from the given ProxySelector, if there is one. */
   202         ProxySelector ps = client.proxy().orElse(null);
   217     private static Proxy retrieveProxy(ProxySelector ps, URI uri) {
   203         if (ps == null || method.equalsIgnoreCase("CONNECT")) {
   218         Proxy proxy = null;
       
   219         List<Proxy> pl = ps.select(uri);
       
   220         if (pl.size() > 0) {
       
   221             Proxy p = pl.get(0);
       
   222             if (p.type().equals(Proxy.Type.HTTP))
       
   223                 proxy = p;
       
   224         }
       
   225         return proxy;
       
   226     }
       
   227 
       
   228     InetSocketAddress proxy() {
       
   229         if (proxy == null || !proxy.type().equals(Proxy.Type.HTTP)
       
   230                 || method.equalsIgnoreCase("CONNECT")) {
   204             return null;
   231             return null;
   205         }
   232         }
   206         return (InetSocketAddress)ps.select(uri).get(0).address();
   233         return (InetSocketAddress)proxy.address();
   207     }
   234     }
   208 
   235 
   209     boolean secure() { return secure; }
   236     boolean secure() { return secure; }
       
   237 
       
   238     @Override
       
   239     public void setProxy(Proxy proxy) {
       
   240         assert isWebSocket;
       
   241         this.proxy = proxy;
       
   242     }
   210 
   243 
   211     @Override
   244     @Override
   212     public void isWebSocket(boolean is) {
   245     public void isWebSocket(boolean is) {
   213         isWebSocket = is;
   246         isWebSocket = is;
   214     }
   247     }
   267                 p = 80;
   300                 p = 80;
   268             }
   301             }
   269         }
   302         }
   270         final String host = uri.getHost();
   303         final String host = uri.getHost();
   271         final int port = p;
   304         final int port = p;
   272         if (proxy(client) == null) {
   305         if (proxy() == null) {
   273             PrivilegedAction<InetSocketAddress> pa = () -> new InetSocketAddress(host, port);
   306             PrivilegedAction<InetSocketAddress> pa = () -> new InetSocketAddress(host, port);
   274             return AccessController.doPrivileged(pa);
   307             return AccessController.doPrivileged(pa);
   275         } else {
   308         } else {
   276             return InetSocketAddress.createUnresolved(host, port);
   309             return InetSocketAddress.createUnresolved(host, port);
   277         }
   310         }