in src/outgoing.c [1298:1363]
apr_status_t serf_connection_create3(
serf_connection_t **conn,
serf_context_t *ctx,
apr_uri_t host_info,
apr_sockaddr_t *host_address,
serf_connection_setup_t setup,
void *setup_baton,
serf_connection_closed_t closed,
void *closed_baton,
apr_pool_t *pool)
{
apr_status_t status = APR_SUCCESS;
serf_config_t *config;
serf_connection_t *c;
/* Set the port number explicitly, needed to create the socket later. */
if (!host_info.port) {
host_info.port = apr_uri_port_of_scheme(host_info.scheme);
}
/* Only lookup the address of the server if no proxy server was
configured. */
if (!ctx->proxy_address) {
if (!host_address) {
status = apr_sockaddr_info_get(&host_address,
host_info.hostname,
APR_UNSPEC, host_info.port, 0, pool);
if (status)
return status;
}
} else {
host_address = NULL;
}
c = serf_connection_create(ctx, host_address, setup, setup_baton,
closed, closed_baton, pool);
/* We're not interested in the path following the hostname. */
c->host_url = apr_uri_unparse(c->pool,
&host_info,
APR_URI_UNP_OMITPATHINFO |
APR_URI_UNP_OMITUSERINFO);
/* Store the host info without the path on the connection. */
(void)apr_uri_parse(c->pool, c->host_url, &(c->host_info));
if (!c->host_info.port) {
c->host_info.port = apr_uri_port_of_scheme(c->host_info.scheme);
}
/* Store the connection specific info in the configuration store */
status = serf__config_store_create_conn_config(c, &config);
if (status)
return status;
c->config = config;
serf_config_set_stringc(config, SERF_CONFIG_HOST_NAME,
c->host_info.hostname);
serf_config_set_stringc(config, SERF_CONFIG_HOST_PORT,
apr_itoa(ctx->pool, c->host_info.port));
*conn = c;
serf__log(LOGLVL_DEBUG, LOGCOMP_CONN, __FILE__, c->config,
"created connection 0x%p\n", c);
return status;
}