Files
2026-02-28 12:32:28 -05:00

117 lines
4.5 KiB
C++

#pragma once
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/crt/Types.h>
#include <memory>
struct aws_http_proxy_strategy;
namespace Aws
{
namespace Crt
{
namespace Http
{
enum class AwsHttpProxyConnectionType;
/**
* Configuration for a proxy strategy that performs basic authentication
*/
struct AWS_CRT_CPP_API HttpProxyStrategyBasicAuthConfig
{
HttpProxyStrategyBasicAuthConfig();
/**
* Basic auth can be applied either to forwarding or tunneling proxy connections, but we need
* to know the type ahead of time
*/
AwsHttpProxyConnectionType ConnectionType;
/**
* Username to apply to the basic authentication process
*/
String Username;
/**
* Password to apply to the basic authentication process
*/
String Password;
};
using KerberosGetTokenFunction = std::function<bool(String &)>;
using NtlmGetTokenFunction = std::function<bool(const String &, String &)>;
/**
* Configuration for a proxy strategy that attempts to use kerberos and ntlm, based on authentication
* failure feedback from the proxy's responses to CONNECT attempts. The kerberos/ntlm callbacks are
* currently synchronous but invoked potentially from within event loop threads. This is not optimal
* but transitioning to fully async hasn't been a need yet.
*
* The adapative strategy will skip an authentication method whose callbacks are not supplied, so you
* can use this for purely kerberos or ntlm as well.
*/
struct AWS_CRT_CPP_API HttpProxyStrategyAdaptiveConfig
{
HttpProxyStrategyAdaptiveConfig() : KerberosGetToken(), NtlmGetCredential(), NtlmGetToken() {}
/**
* User-supplied callback for fetching kerberos tokens
*/
KerberosGetTokenFunction KerberosGetToken;
/**
* User-supplied callback for fetching an ntlm credential
*/
KerberosGetTokenFunction NtlmGetCredential;
/**
* User-supplied callback for fetching an ntlm token
*/
NtlmGetTokenFunction NtlmGetToken;
};
/**
* Wrapper class for a C-level proxy strategy - an object that allows the user to transform or modify
* the authentication logic when connecting to a proxy.
*/
class AWS_CRT_CPP_API HttpProxyStrategy
{
public:
HttpProxyStrategy(struct aws_http_proxy_strategy *strategy);
virtual ~HttpProxyStrategy();
/// @private
struct aws_http_proxy_strategy *GetUnderlyingHandle() const noexcept { return m_strategy; }
/**
* Creates a proxy strategy that performs basic authentication
* @param config basic authentication configuration options
* @param allocator allocator to use
* @return a new basic authentication proxy strategy
*/
static std::shared_ptr<HttpProxyStrategy> CreateBasicHttpProxyStrategy(
const HttpProxyStrategyBasicAuthConfig &config,
Allocator *allocator = ApiAllocator());
/**
* Creates a proxy strategy that, depending on configuration, can attempt kerberos and/or ntlm
* authentication when connecting to the proxy
* @param config the adaptive strategy configuration options
* @param allocator allocator to use
* @return a new adaptive proxy strategy
*/
static std::shared_ptr<HttpProxyStrategy> CreateAdaptiveHttpProxyStrategy(
const HttpProxyStrategyAdaptiveConfig &config,
Allocator *allocator = ApiAllocator());
protected:
struct aws_http_proxy_strategy *m_strategy;
};
} // namespace Http
} // namespace Crt
} // namespace Aws