Path: blob/master/src/java.net.http/share/classes/jdk/internal/net/http/HttpRequestBuilderImpl.java
41171 views
/*1* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425package jdk.internal.net.http;2627import java.net.URI;28import java.time.Duration;29import java.util.Locale;30import java.util.Optional;31import java.net.http.HttpClient;32import java.net.http.HttpRequest;33import java.net.http.HttpRequest.BodyPublisher;3435import jdk.internal.net.http.common.HttpHeadersBuilder;36import jdk.internal.net.http.common.Utils;37import static java.util.Objects.requireNonNull;38import static jdk.internal.net.http.common.Utils.isValidName;39import static jdk.internal.net.http.common.Utils.isValidValue;40import static jdk.internal.net.http.common.Utils.newIAE;4142public class HttpRequestBuilderImpl implements HttpRequest.Builder {4344private HttpHeadersBuilder headersBuilder;45private URI uri;46private String method;47private boolean expectContinue;48private BodyPublisher bodyPublisher;49private volatile Optional<HttpClient.Version> version;50private Duration duration;5152public HttpRequestBuilderImpl(URI uri) {53requireNonNull(uri, "uri must be non-null");54checkURI(uri);55this.uri = uri;56this.headersBuilder = new HttpHeadersBuilder();57this.method = "GET"; // default, as per spec58this.version = Optional.empty();59}6061public HttpRequestBuilderImpl() {62this.headersBuilder = new HttpHeadersBuilder();63this.method = "GET"; // default, as per spec64this.version = Optional.empty();65}6667@Override68public HttpRequestBuilderImpl uri(URI uri) {69requireNonNull(uri, "uri must be non-null");70checkURI(uri);71this.uri = uri;72return this;73}7475static void checkURI(URI uri) {76String scheme = uri.getScheme();77if (scheme == null)78throw newIAE("URI with undefined scheme");79scheme = scheme.toLowerCase(Locale.US);80if (!(scheme.equals("https") || scheme.equals("http"))) {81throw newIAE("invalid URI scheme %s", scheme);82}83if (uri.getHost() == null) {84throw newIAE("unsupported URI %s", uri);85}86}8788@Override89public HttpRequestBuilderImpl copy() {90HttpRequestBuilderImpl b = new HttpRequestBuilderImpl();91b.uri = this.uri;92b.headersBuilder = this.headersBuilder.structuralCopy();93b.method = this.method;94b.expectContinue = this.expectContinue;95b.bodyPublisher = bodyPublisher;96b.uri = uri;97b.duration = duration;98b.version = version;99return b;100}101102private void checkNameAndValue(String name, String value) {103requireNonNull(name, "name");104requireNonNull(value, "value");105if (!isValidName(name)) {106throw newIAE("invalid header name: \"%s\"", name);107}108if (!Utils.ALLOWED_HEADERS.test(name, null)) {109throw newIAE("restricted header name: \"%s\"", name);110}111if (!isValidValue(value)) {112throw newIAE("invalid header value: \"%s\"", value);113}114}115116@Override117public HttpRequestBuilderImpl setHeader(String name, String value) {118checkNameAndValue(name, value);119headersBuilder.setHeader(name, value);120return this;121}122123@Override124public HttpRequestBuilderImpl header(String name, String value) {125checkNameAndValue(name, value);126headersBuilder.addHeader(name, value);127return this;128}129130@Override131public HttpRequestBuilderImpl headers(String... params) {132requireNonNull(params);133if (params.length == 0 || params.length % 2 != 0) {134throw newIAE("wrong number, %d, of parameters", params.length);135}136for (int i = 0; i < params.length; i += 2) {137String name = params[i];138String value = params[i + 1];139header(name, value);140}141return this;142}143144@Override145public HttpRequestBuilderImpl expectContinue(boolean enable) {146expectContinue = enable;147return this;148}149150@Override151public HttpRequestBuilderImpl version(HttpClient.Version version) {152requireNonNull(version);153this.version = Optional.of(version);154return this;155}156157HttpHeadersBuilder headersBuilder() { return headersBuilder; }158159URI uri() { return uri; }160161String method() { return method; }162163boolean expectContinue() { return expectContinue; }164165BodyPublisher bodyPublisher() { return bodyPublisher; }166167Optional<HttpClient.Version> version() { return version; }168169@Override170public HttpRequest.Builder GET() {171return method0("GET", null);172}173174@Override175public HttpRequest.Builder POST(BodyPublisher body) {176return method0("POST", requireNonNull(body));177}178179@Override180public HttpRequest.Builder DELETE() {181return method0("DELETE", null);182}183184@Override185public HttpRequest.Builder PUT(BodyPublisher body) {186return method0("PUT", requireNonNull(body));187}188189@Override190public HttpRequest.Builder method(String method, BodyPublisher body) {191requireNonNull(method);192if (method.isEmpty())193throw newIAE("illegal method <empty string>");194if (method.equals("CONNECT"))195throw newIAE("method CONNECT is not supported");196if (!Utils.isValidName(method))197throw newIAE("illegal method \""198+ method.replace("\n","\\n")199.replace("\r", "\\r")200.replace("\t", "\\t")201+ "\"");202return method0(method, requireNonNull(body));203}204205private HttpRequest.Builder method0(String method, BodyPublisher body) {206assert method != null;207assert !method.isEmpty();208this.method = method;209this.bodyPublisher = body;210return this;211}212213@Override214public HttpRequest build() {215if (uri == null)216throw new IllegalStateException("uri is null");217assert method != null;218return new ImmutableHttpRequest(this);219}220221public HttpRequestImpl buildForWebSocket() {222if (uri == null)223throw new IllegalStateException("uri is null");224assert method != null;225return new HttpRequestImpl(this);226}227228@Override229public HttpRequest.Builder timeout(Duration duration) {230requireNonNull(duration);231if (duration.isNegative() || Duration.ZERO.equals(duration))232throw new IllegalArgumentException("Invalid duration: " + duration);233this.duration = duration;234return this;235}236237Duration timeout() { return duration; }238239}240241242