in src/outgoing.c [343:431]
apr_status_t serf__open_connections(serf_context_t *ctx)
{
int i;
for (i = ctx->conns->nelts; i--; ) {
serf_connection_t *conn = GET_CONN(ctx, i);
apr_status_t status;
apr_socket_t *skt;
conn->seen_in_pollset = 0;
if (conn->skt != NULL) {
#ifdef SERF_DEBUG_BUCKET_USE
check_buckets_drained(conn);
#endif
continue;
}
/* Delay opening until we have something to deliver! */
if (conn->unwritten_reqs == NULL) {
continue;
}
apr_pool_clear(conn->skt_pool);
status = apr_socket_create(&skt, conn->address->family,
SOCK_STREAM,
#if APR_MAJOR_VERSION > 0
APR_PROTO_TCP,
#endif
conn->skt_pool);
serf__log(LOGLVL_DEBUG, LOGCOMP_CONN, __FILE__, conn->config,
"created socket for conn 0x%p, status %d\n", conn, status);
if (status != APR_SUCCESS)
return status;
apr_pool_cleanup_register(conn->skt_pool, conn, clean_skt,
apr_pool_cleanup_null);
/* Set the socket to be non-blocking */
if ((status = apr_socket_timeout_set(skt, 0)) != APR_SUCCESS)
return status;
/* Disable Nagle's algorithm */
if ((status = apr_socket_opt_set(skt,
APR_TCP_NODELAY, 1)) != APR_SUCCESS)
return status;
/* Configured. Store it into the connection now. */
conn->skt = skt;
/* Remember time when we started connecting to server to calculate
network latency. */
conn->connect_time = apr_time_now();
/* Now that the socket is set up, let's connect it. This should
* return immediately.
*/
status = apr_socket_connect(skt, conn->address);
if (status != APR_SUCCESS) {
if (!APR_STATUS_IS_EINPROGRESS(status))
return status;
/* Keep track of when we really connect */
conn->wait_for_connect = true;
}
serf_pump__init(&conn->pump, &conn->io, skt, conn->config,
conn->allocator, conn->pool);
status = serf_config_set_string(conn->config,
SERF_CONFIG_CONN_PIPELINING,
(conn->max_outstanding_requests != 1 &&
conn->pipelining == 1) ? "Y" : "N");
if (status)
return status;
/* Flag our pollset as dirty now that we have a new socket. */
serf_io__set_pollset_dirty(&conn->io);
if (! conn->wait_for_connect) {
status = connect_connection(conn);
if (status)
return status;
}
}
return APR_SUCCESS;
}