in src/native/http_connection_manager.c [142:296]
JNIEXPORT jlong JNICALL Java_software_amazon_awssdk_crt_http_HttpClientConnectionManager_httpClientConnectionManagerNew(
JNIEnv *env,
jclass jni_class,
jobject conn_manager_jobject,
jlong jni_client_bootstrap,
jlong jni_socket_options,
jlong jni_tls_ctx,
jint jni_window_size,
jbyteArray jni_endpoint,
jint jni_port,
jint jni_max_conns,
jint jni_proxy_connection_type,
jbyteArray jni_proxy_host,
jint jni_proxy_port,
jlong jni_proxy_tls_context,
jint jni_proxy_authorization_type,
jbyteArray jni_proxy_authorization_username,
jbyteArray jni_proxy_authorization_password,
jboolean jni_manual_window_management,
jlong jni_max_connection_idle_in_milliseconds,
jlong jni_monitoring_throughput_threshold_in_bytes_per_second,
jint jni_monitoring_failure_interval_in_seconds) {
(void)jni_class;
struct aws_client_bootstrap *client_bootstrap = (struct aws_client_bootstrap *)jni_client_bootstrap;
struct aws_socket_options *socket_options = (struct aws_socket_options *)jni_socket_options;
struct aws_tls_ctx *tls_ctx = (struct aws_tls_ctx *)jni_tls_ctx;
struct http_connection_manager_binding *binding = NULL;
if (!client_bootstrap) {
aws_jni_throw_runtime_exception(env, "ClientBootstrap can't be null");
return (jlong)NULL;
}
if (!socket_options) {
aws_jni_throw_runtime_exception(env, "SocketOptions can't be null");
return (jlong)NULL;
}
struct aws_allocator *allocator = aws_jni_get_allocator();
struct aws_byte_cursor endpoint = aws_jni_byte_cursor_from_jbyteArray_acquire(env, jni_endpoint);
if (jni_port <= 0 || 65535 < jni_port) {
aws_jni_throw_runtime_exception(env, "Port must be between 1 and 65535");
goto cleanup;
}
if (jni_window_size <= 0) {
aws_jni_throw_runtime_exception(env, "Window Size must be > 0");
goto cleanup;
}
if (jni_max_conns <= 0) {
aws_jni_throw_runtime_exception(env, "Max Connections must be > 0");
goto cleanup;
}
uint16_t port = (uint16_t)jni_port;
int use_tls = (jni_tls_ctx != 0);
struct aws_tls_connection_options tls_conn_options;
AWS_ZERO_STRUCT(tls_conn_options);
if (use_tls) {
aws_tls_connection_options_init_from_ctx(&tls_conn_options, tls_ctx);
aws_tls_connection_options_set_server_name(&tls_conn_options, allocator, &endpoint);
}
binding = aws_mem_calloc(allocator, 1, sizeof(struct http_connection_manager_binding));
AWS_FATAL_ASSERT(binding);
binding->java_http_conn_manager = (*env)->NewWeakGlobalRef(env, conn_manager_jobject);
jint jvmresult = (*env)->GetJavaVM(env, &binding->jvm);
(void)jvmresult;
AWS_FATAL_ASSERT(jvmresult == 0);
struct aws_http_connection_manager_options manager_options;
AWS_ZERO_STRUCT(manager_options);
manager_options.bootstrap = client_bootstrap;
manager_options.initial_window_size = (size_t)jni_window_size;
manager_options.socket_options = socket_options;
manager_options.tls_connection_options = NULL;
manager_options.host = endpoint;
manager_options.port = port;
manager_options.max_connections = (size_t)jni_max_conns;
manager_options.shutdown_complete_callback = &s_on_http_conn_manager_shutdown_complete_callback;
manager_options.shutdown_complete_user_data = binding;
manager_options.monitoring_options = NULL;
/* TODO: this variable needs to be renamed in aws-c-http. Come back and change it next revision. */
manager_options.enable_read_back_pressure = jni_manual_window_management;
manager_options.max_connection_idle_in_milliseconds = jni_max_connection_idle_in_milliseconds;
if (use_tls) {
manager_options.tls_connection_options = &tls_conn_options;
}
struct aws_http_connection_monitoring_options monitoring_options;
AWS_ZERO_STRUCT(monitoring_options);
if (jni_monitoring_throughput_threshold_in_bytes_per_second >= 0 &&
jni_monitoring_failure_interval_in_seconds >= 2) {
monitoring_options.minimum_throughput_bytes_per_second =
jni_monitoring_throughput_threshold_in_bytes_per_second;
monitoring_options.allowable_throughput_failure_interval_seconds = jni_monitoring_failure_interval_in_seconds;
manager_options.monitoring_options = &monitoring_options;
}
struct aws_http_proxy_options proxy_options;
AWS_ZERO_STRUCT(proxy_options);
struct aws_tls_connection_options proxy_tls_conn_options;
AWS_ZERO_STRUCT(proxy_tls_conn_options);
aws_http_proxy_options_jni_init(
env,
&proxy_options,
jni_proxy_connection_type,
&proxy_tls_conn_options,
jni_proxy_host,
(uint16_t)jni_proxy_port,
jni_proxy_authorization_username,
jni_proxy_authorization_password,
jni_proxy_authorization_type,
(struct aws_tls_ctx *)jni_proxy_tls_context);
if (jni_proxy_host != NULL) {
manager_options.proxy_options = &proxy_options;
}
binding->manager = aws_http_connection_manager_new(allocator, &manager_options);
if (binding->manager == NULL) {
aws_jni_throw_runtime_exception(
env, "Failed to create connection manager: %s", aws_error_str(aws_last_error()));
}
aws_http_proxy_options_jni_clean_up(
env, &proxy_options, jni_proxy_host, jni_proxy_authorization_username, jni_proxy_authorization_password);
if (use_tls) {
aws_tls_connection_options_clean_up(&tls_conn_options);
}
cleanup:
aws_jni_byte_cursor_from_jbyteArray_release(env, jni_endpoint, endpoint);
if (binding->manager == NULL) {
s_destroy_manager_binding(binding);
binding = NULL;
}
return (jlong)binding;
}