Example #1
0
void h2o_dispose_request(h2o_req_t *req)
{
    /* close the generator if it is still open */
    if (req->_generator != NULL) {
        /* close generator */
        if (req->_generator->stop != NULL)
            req->_generator->stop(req->_generator, req);
        req->_generator = NULL;
    }
    /* close the ostreams still open */
    while (req->_ostr_top->next != NULL) {
        if (req->_ostr_top->stop != NULL)
            req->_ostr_top->stop(req->_ostr_top, req);
        req->_ostr_top = req->_ostr_top->next;
    }

    h2o_timeout_unlink(&req->_timeout_entry);

    if (req->version != 0 && req->host_config != NULL) {
        h2o_logger_t **logger = req->host_config->loggers.entries, **end = logger + req->host_config->loggers.size;
        for (; logger != end; ++logger) {
            (*logger)->log_access((*logger), req);
        }
    }

    h2o_mempool_clear(&req->pool);
}
Example #2
0
File: socket.c Project: alemic/h2o
static void dispose_socket(h2o_socket_t *sock, int status)
{
    if (sock->ssl != NULL) {
        SSL_free(sock->ssl->ssl);
        free(sock->ssl->input.encrypted);
        h2o_mempool_clear(&sock->ssl->output.pool);
        free(sock->ssl);
    }
    free(sock->input);

    do_dispose_socket(sock);
}
Example #3
0
File: socket.c Project: alemic/h2o
void on_write_complete(h2o_socket_t *sock, int status)
{
    h2o_socket_cb cb;

    if (sock->ssl != NULL) {
        memset(&sock->ssl->output.bufs, 0, sizeof(sock->ssl->output.bufs));
        h2o_mempool_clear(&sock->ssl->output.pool);
    }

    cb = sock->_cb.write;
    sock->_cb.write = NULL;
    cb(sock, status);
}
Example #4
0
File: socket.c Project: mattn/h2o
static void dispose_socket(h2o_socket_t *sock, int status)
{
    sock->loop->_on_close(sock);

    if (sock->ssl != NULL) {
        SSL_free(sock->ssl->ssl);
        free(sock->ssl->input.encrypted);
        h2o_mempool_clear(&sock->ssl->output.pool);
        free(sock->ssl);
    }
    free(sock->input);
    wreq_free_buffer_if_allocated(sock);
    close(sock->fd);

    sock->_flags = H2O_SOCKET_FLAG_IS_DISPOSED;
    h2o_socket__link_to_statechanged(sock);
}
Example #5
0
static int on_body(h2o_http1client_t *client, const char *errstr)
{
    if (errstr != NULL && errstr != h2o_http1client_error_is_eos) {
        fprintf(stderr, "%s\n", errstr);
        exit(1);
        return -1;
    }

    fwrite(client->sock->input->bytes, 1, client->sock->input->size, stdout);
    h2o_buffer_consume(&client->sock->input, client->sock->input->size);

    if (errstr == h2o_http1client_error_is_eos) {
        if (--cnt_left != 0) {
            /* next attempt */
            h2o_mempool_clear(&pool);
            start_request(client->ctx);
        }
    }

    return 0;
}
Example #6
0
static void start_request(h2o_http1client_ctx_t *ctx)
{
    char *scheme, *host, *path;
    uint16_t port;
    h2o_iovec_t *req;
    h2o_http1client_t *client;

    /* clear memory pool */
    h2o_mempool_clear(&pool);

    /* parse URL */
    if (h2o_parse_url(&pool, url, &scheme, &host, &port, &path) != 0) {
        fprintf(stderr, "unrecognized type of URL: %s\n", url);
        exit(1);
    }
    if (strcmp(scheme, "https") == 0) {
        fprintf(stderr, "https is not (yet) supported\n");
        exit(1);
    }
    /* build request */
    req = h2o_mempool_alloc(&pool, sizeof(*req));
    req->base = h2o_mempool_alloc(&pool, 1024);
    req->len = snprintf(req->base, 1024, "GET %s HTTP/1.1\r\nhost: %s:%u\r\n\r\n", path, host, (unsigned)port);
    assert(req->len < 1024);

    /* initiate the request */
    if (1) {
        if (sockpool == NULL) {
            sockpool = h2o_malloc(sizeof(*sockpool));
            h2o_socketpool_init(sockpool, host, port, 10);
            h2o_socketpool_set_timeout(sockpool, ctx->loop, 5000 /* in msec */);
        }
        client = h2o_http1client_connect_with_pool(ctx, &pool, sockpool, on_connect);
    } else {
        client = h2o_http1client_connect(ctx, &pool, host, port, on_connect);
    }
    assert(client != NULL);
    client->data = req;
}