Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package software.amazon.smithy.java.client.http;

import java.time.Duration;
import software.amazon.smithy.java.core.serde.document.Document;
import software.amazon.smithy.java.http.api.HttpVersion;

/**
* Common HTTP transport configuration shared across transport implementations.
*
* <p>Subclass this to add transport-specific settings.
*/
public class HttpTransportConfig {

private Duration requestTimeout;
private Duration connectTimeout;
private HttpVersion httpVersion;

/**
* Per-request timeout. Null means no timeout (use client default).
*
* <p>Defined in the document data as milliseconds.
*
* @return request timeout.
*/
public Duration requestTimeout() {
return requestTimeout;
}

public HttpTransportConfig requestTimeout(Duration requestTimeout) {
this.requestTimeout = requestTimeout;
return this;
}

/**
* TCP connect timeout. Null means use transport default.
*/
public Duration connectTimeout() {
return connectTimeout;
}

public HttpTransportConfig connectTimeout(Duration connectTimeout) {
this.connectTimeout = connectTimeout;
return this;
}

/**
* HTTP version preference. Null means use transport default.
*
* <p>Defined in the document data as "http/1.0", "http/1.1", or "h2".
*/
public HttpVersion httpVersion() {
return httpVersion;
}

public HttpTransportConfig httpVersion(HttpVersion httpVersion) {
this.httpVersion = httpVersion;
return this;
}

/**
* Populate fields from a Document config.
*
* <pre>{@code
* {
* "requestTimeoutMs": 5000,
* "connectTimeoutMs": 3000,
* "httpVersion": "HTTP/2.0"
* }
* }</pre>
*
* @param doc configuration document
* @return this config for chaining
*/
public HttpTransportConfig fromDocument(Document doc) {
var config = doc.asStringMap();

var timeout = config.get("requestTimeoutMs");
if (timeout != null) {
this.requestTimeout = Duration.ofMillis(timeout.asLong());
}

var connTimeout = config.get("connectTimeoutMs");
if (connTimeout != null) {
this.connectTimeout = Duration.ofMillis(connTimeout.asLong());
}

var version = config.get("httpVersion");
if (version != null) {
this.httpVersion = HttpVersion.from(version.asString());
}

return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public class JavaHttpClientTransport implements ClientTransport<HttpRequest, Htt

private static final InternalLogger LOGGER = InternalLogger.getLogger(JavaHttpClientTransport.class);
private final HttpClient client;
private final Duration defaultRequestTimeout;

static {
// For some reason, this can't just be done in the constructor to always take effect.
Expand Down Expand Up @@ -67,14 +68,24 @@ private static void setHostProperties() {
}

public JavaHttpClientTransport() {
this(HttpClient.newHttpClient());
this(HttpClient.newHttpClient(), null);
}

/**
* @param client Java client to use.
*/
public JavaHttpClientTransport(HttpClient client) {
this(client, null);
}

/**
* @param client Java client to use.
* @param defaultRequestTimeout Default per-request timeout. Used when {@link HttpContext#HTTP_REQUEST_TIMEOUT}
* is not set in the request context. Null means no default.
*/
public JavaHttpClientTransport(HttpClient client, Duration defaultRequestTimeout) {
this.client = client;
this.defaultRequestTimeout = defaultRequestTimeout;
setHostProperties();
}

Expand Down Expand Up @@ -128,7 +139,9 @@ private java.net.http.HttpRequest createJavaRequest(Context context, HttpRequest
.uri(request.uri());

Duration requestTimeout = context.get(HttpContext.HTTP_REQUEST_TIMEOUT);

if (requestTimeout == null) {
requestTimeout = defaultRequestTimeout;
}
if (requestTimeout != null) {
httpRequestBuilder.timeout(requestTimeout);
}
Expand Down Expand Up @@ -216,15 +229,15 @@ public String name() {
@Override
public JavaHttpClientTransport createTransport(Document node) {
setHostProperties();
var versionNode = node.asStringMap().get("version");
HttpClient httpClient;
if (versionNode != null) {
var version = HttpVersion.from(versionNode.asString());
httpClient = HttpClient.newBuilder().version(smithyToHttpVersion(version)).build();
} else {
httpClient = HttpClient.newHttpClient();
var config = new HttpTransportConfig().fromDocument(node);
var builder = HttpClient.newBuilder();
if (config.httpVersion() != null) {
builder.version(smithyToHttpVersion(config.httpVersion()));
}
if (config.connectTimeout() != null) {
builder.connectTimeout(config.connectTimeout());
}
return new JavaHttpClientTransport(httpClient);
return new JavaHttpClientTransport(builder.build(), config.requestTimeout());
}

@Override
Expand Down
Loading