in src/incoming.c [546:620]
apr_status_t serf_incoming_create2(
serf_incoming_t **client,
serf_context_t *ctx,
apr_socket_t *insock,
serf_connection_setup_t setup,
void *setup_baton,
serf_incoming_closed_t closed,
void *closed_baton,
serf_incoming_request_setup_t req_setup,
void *req_setup_baton,
apr_pool_t *client_pool)
{
apr_status_t status;
serf_incoming_t *ic;
serf_config_t *config;
ic = apr_palloc(client_pool, sizeof(*ic));
ic->ctx = ctx;
ic->pool = client_pool;
ic->allocator = serf_bucket_allocator_create(client_pool, NULL, NULL);
ic->io.type = SERF_IO_CLIENT;
ic->io.u.client = ic;
ic->io.ctx = ctx;
ic->io.dirty_conn = false;
ic->io.reqevents = 0;
ic->req_setup = req_setup;
ic->req_setup_baton = req_setup_baton;
ic->skt = insock;
ic->wait_for_connect = true;
/* Detect HTTP 1 or 2 via peek operation */
ic->framing_type = SERF_CONNECTION_FRAMING_TYPE_NONE;
ic->setup = setup;
ic->setup_baton = setup_baton;
ic->closed = closed;
ic->closed_baton = closed_baton;
/* Store the connection specific info in the configuration store */
status = serf__config_store_create_client_config(ic, &config);
if (status)
return status;
ic->config = config;
/* Prepare wrapping the socket with buckets. */
serf_pump__init(&ic->pump, &ic->io, ic->skt, config, ic->allocator, ic->pool);
ic->protocol_baton = NULL;
ic->perform_read = read_from_client;
ic->perform_write = write_to_client;
ic->perform_hangup = hangup_client;
ic->perform_teardown = NULL;
ic->perform_pre_teardown = NULL;
ic->current_request = NULL;
ic->desc.desc_type = APR_POLL_SOCKET;
ic->desc.desc.s = ic->skt;
ic->desc.reqevents = APR_POLLIN | APR_POLLERR | APR_POLLHUP;
ic->seen_in_pollset = 0;
status = ctx->pollset_add(ctx->pollset_baton, &ic->desc, &ic->io);
if (status)
return status;
apr_pool_cleanup_register(ic->pool, ic, incoming_cleanup,
apr_pool_cleanup_null);
APR_ARRAY_PUSH(ctx->incomings, serf_incoming_t *) = ic;
*client = ic;
return status;
}