-
Notifications
You must be signed in to change notification settings - Fork 910
Enable HTTP proxying for Netty client #1384
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
5 changes: 5 additions & 0 deletions
5
.changes/next-release/feature-NettyNIOHTTPClient-8d0be28.json
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
{ | ||
"category": "Netty NIO HTTP Client", | ||
"type": "feature", | ||
"description": "Add ability to to use HTTP proxies with the Netty async client." | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
207 changes: 207 additions & 0 deletions
207
...ty-nio-client/src/main/java/software/amazon/awssdk/http/nio/netty/ProxyConfiguration.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,207 @@ | ||
/* | ||
* Copyright 2010-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"). | ||
* You may not use this file except in compliance with the License. | ||
* A copy of the License is located at | ||
* | ||
* http://aws.amazon.com/apache2.0 | ||
* | ||
* or in the "license" file accompanying this file. This file is distributed | ||
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either | ||
* express or implied. See the License for the specific language governing | ||
* permissions and limitations under the License. | ||
*/ | ||
|
||
package software.amazon.awssdk.http.nio.netty; | ||
|
||
import java.util.Collections; | ||
import java.util.HashSet; | ||
import java.util.Set; | ||
import software.amazon.awssdk.annotations.SdkPublicApi; | ||
import software.amazon.awssdk.utils.builder.CopyableBuilder; | ||
import software.amazon.awssdk.utils.builder.ToCopyableBuilder; | ||
|
||
/** | ||
* Proxy configuration for {@link NettyNioAsyncHttpClient}. This class is used to configure an HTTP proxy to be used by | ||
* the {@link NettyNioAsyncHttpClient}. | ||
* | ||
* @see NettyNioAsyncHttpClient.Builder#proxyConfiguration(ProxyConfiguration) | ||
*/ | ||
@SdkPublicApi | ||
public final class ProxyConfiguration implements ToCopyableBuilder<ProxyConfiguration.Builder, ProxyConfiguration> { | ||
private final String scheme; | ||
private final String host; | ||
private final int port; | ||
private final Set<String> nonProxyHosts; | ||
|
||
private ProxyConfiguration(BuilderImpl builder) { | ||
this.scheme = builder.scheme; | ||
this.host = builder.host; | ||
this.port = builder.port; | ||
this.nonProxyHosts = Collections.unmodifiableSet(builder.nonProxyHosts); | ||
} | ||
|
||
/** | ||
* @return The proxy scheme. | ||
*/ | ||
public String scheme() { | ||
return scheme; | ||
} | ||
|
||
/** | ||
* @return The proxy host. | ||
*/ | ||
public String host() { | ||
return host; | ||
} | ||
|
||
/** | ||
* @return The proxy port. | ||
*/ | ||
public int port() { | ||
return port; | ||
} | ||
|
||
/** | ||
* @return The set of hosts that should not be proxied. | ||
*/ | ||
public Set<String> nonProxyHosts() { | ||
return nonProxyHosts; | ||
} | ||
|
||
@Override | ||
public boolean equals(Object o) { | ||
if (this == o) { | ||
return true; | ||
} | ||
|
||
if (o == null || getClass() != o.getClass()) { | ||
return false; | ||
} | ||
|
||
ProxyConfiguration that = (ProxyConfiguration) o; | ||
|
||
if (port != that.port) { | ||
return false; | ||
} | ||
|
||
if (scheme != null ? !scheme.equals(that.scheme) : that.scheme != null) { | ||
return false; | ||
} | ||
|
||
if (host != null ? !host.equals(that.host) : that.host != null) { | ||
return false; | ||
} | ||
|
||
return nonProxyHosts.equals(that.nonProxyHosts); | ||
|
||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
int result = scheme != null ? scheme.hashCode() : 0; | ||
result = 31 * result + (host != null ? host.hashCode() : 0); | ||
result = 31 * result + port; | ||
result = 31 * result + nonProxyHosts.hashCode(); | ||
return result; | ||
} | ||
|
||
@Override | ||
public Builder toBuilder() { | ||
return new BuilderImpl(this); | ||
} | ||
|
||
public static Builder builder() { | ||
return new BuilderImpl(); | ||
} | ||
|
||
/** | ||
* Builder for {@link ProxyConfiguration}. | ||
*/ | ||
public interface Builder extends CopyableBuilder<Builder, ProxyConfiguration> { | ||
|
||
/** | ||
* Set the hostname of the proxy. | ||
* @param host The proxy host. | ||
* @return This object for method chaining. | ||
*/ | ||
Builder host(String host); | ||
|
||
/** | ||
* Set the port that the proxy expects connections on. | ||
* @param port The proxy port. | ||
* @return This object for method chaining. | ||
*/ | ||
Builder port(int port); | ||
|
||
/** | ||
* The HTTP scheme to use for connecting to the proxy. Valid values are {@code http} and {@code https}. | ||
dagnir marked this conversation as resolved.
Show resolved
Hide resolved
|
||
* <p> | ||
* The client defaults to {@code http} if none is given. | ||
* | ||
* @param scheme The proxy scheme. | ||
* @return This object for method chaining. | ||
*/ | ||
Builder scheme(String scheme); | ||
|
||
/** | ||
* Set the set of hosts that should not be proxied. Any request whose host portion matches any of the patterns | ||
* given in the set will be sent to the remote host directly instead of through the proxy. | ||
* | ||
* @param nonProxyHosts The set of hosts that should not be proxied. | ||
* @return This object for method chaining. | ||
*/ | ||
Builder nonProxyHosts(Set<String> nonProxyHosts); | ||
} | ||
|
||
private static final class BuilderImpl implements Builder { | ||
private String scheme; | ||
private String host; | ||
private int port; | ||
private Set<String> nonProxyHosts = Collections.emptySet(); | ||
|
||
private BuilderImpl() { | ||
} | ||
|
||
private BuilderImpl(ProxyConfiguration proxyConfiguration) { | ||
this.scheme = proxyConfiguration.scheme; | ||
this.host = proxyConfiguration.host; | ||
this.port = proxyConfiguration.port; | ||
this.nonProxyHosts = new HashSet<>(proxyConfiguration.nonProxyHosts); | ||
} | ||
|
||
@Override | ||
public Builder scheme(String scheme) { | ||
this.scheme = scheme; | ||
return this; | ||
} | ||
|
||
@Override | ||
public Builder host(String host) { | ||
this.host = host; | ||
return this; | ||
} | ||
|
||
@Override | ||
public Builder port(int port) { | ||
this.port = port; | ||
return this; | ||
} | ||
|
||
@Override | ||
public Builder nonProxyHosts(Set<String> nonProxyHosts) { | ||
if (nonProxyHosts != null) { | ||
this.nonProxyHosts = new HashSet<>(nonProxyHosts); | ||
} else { | ||
this.nonProxyHosts = Collections.emptySet(); | ||
} | ||
return this; | ||
} | ||
|
||
@Override | ||
public ProxyConfiguration build() { | ||
return new ProxyConfiguration(this); | ||
} | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.