apr_status_t serf_incoming_create2()

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;
}