void h2o_socket_ssl_server_handshake(h2o_socket_t *sock, SSL_CTX *ssl_ctx, h2o_socket_cb handshake_cb) { static BIO_METHOD bio_methods = { BIO_TYPE_FD, "h2o_socket", write_bio, read_bio, puts_bio, NULL, ctrl_bio, new_bio, free_bio, NULL }; BIO *bio; sock->ssl = h2o_malloc(sizeof(*sock->ssl)); memset(sock->ssl, 0, offsetof(struct st_h2o_socket_ssl_t, output.pool)); h2o_mempool_init(&sock->ssl->output.pool); bio = BIO_new(&bio_methods); bio->ptr = sock; bio->init = 1; sock->ssl->ssl = SSL_new(ssl_ctx); SSL_set_bio(sock->ssl->ssl, bio, bio); sock->ssl->handshake.cb = handshake_cb; proceed_handshake(sock, 0); }
void h2o_init_request(h2o_req_t *req, h2o_conn_t *conn, h2o_req_t *src) { /* clear all memory (expect memory pool, since it is large) */ memset(req, 0, offsetof(h2o_req_t, pool)); /* init memory pool (before others, since it may be used) */ h2o_mempool_init(&req->pool); /* init properties that should be initialized to non-zero */ req->conn = conn; req->_timeout_entry.cb = deferred_proceed_cb; req->res.content_length = SIZE_MAX; if (src != NULL) { #define COPY(buf) do { \ req->buf.base = h2o_mempool_alloc(&req->pool, src->buf.len); \ memcpy(req->buf.base, src->buf.base, src->buf.len); \ req->buf.len = src->buf.len; \ } while (0) COPY(authority); COPY(method); COPY(path); COPY(scheme); req->version = src->version; h2o_vector_reserve(&req->pool, (h2o_vector_t*)&req->headers, sizeof(h2o_header_t), src->headers.size); memcpy(req->headers.entries, src->headers.entries, src->headers.size); req->headers.size = src->headers.size; req->entity = src->entity; req->http1_is_persistent = src->http1_is_persistent; if (src->upgrade.base != NULL) { COPY(upgrade); } else { req->upgrade.base = NULL; req->upgrade.len = 0; } #undef COPY } }
int main(int argc, char **argv) { h2o_http1client_ctx_t ctx = { NULL, &zero_timeout, &io_timeout }; if (argc != 2) { fprintf(stderr, "Usage: %s <url>\n", argv[0]); return 1; } url = argv[1]; h2o_mempool_init(&pool); /* setup context */ #if H2O_USE_LIBUV ctx.loop = uv_loop_new(); #else ctx.loop = h2o_evloop_create(); #endif h2o_timeout_init(ctx.loop, &zero_timeout, 0); h2o_timeout_init(ctx.loop, &io_timeout, 5000); /* 5 seconds */ /* setup the first request */ start_request(&ctx); while (cnt_left != 0) { #if H2O_USE_LIBUV uv_run(ctx.loop, UV_RUN_ONCE); #else h2o_evloop_run(ctx.loop); #endif } return 0; }