static void on_read_proxy_line(h2o_socket_t *sock, int status) { struct st_h2o_accept_data_t *data = sock->data; if (status != 0) { free_accept_data(data); h2o_socket_close(sock); return; } struct sockaddr_storage addr; socklen_t addrlen; ssize_t r = parse_proxy_line(sock->input->bytes, sock->input->size, (void *)&addr, &addrlen); switch (r) { case -1: /* error, just pass the input to the next handler */ break; case -2: /* incomplete */ return; default: h2o_buffer_consume(&sock->input, r); if (addrlen != 0) h2o_socket_setpeername(sock, (void *)&addr, addrlen); break; } if (data->ctx->ssl_ctx != NULL) { h2o_socket_ssl_server_handshake(sock, data->ctx->ssl_ctx, on_ssl_handshake_complete); } else { h2o_accept_ctx_t *ctx = free_accept_data(data); sock->data = NULL; h2o_http1_accept(ctx, sock); } }
static void on_ssl_handshake_complete(h2o_socket_t *sock, int status) { h2o_accept_ctx_t *ctx = free_accept_data(sock->data); sock->data = NULL; if (status != 0) { h2o_socket_close(sock); return; } h2o_iovec_t proto = h2o_socket_ssl_get_selected_protocol(sock); const h2o_iovec_t *ident; for (ident = h2o_http2_alpn_protocols; ident->len != 0; ++ident) { if (proto.len == ident->len && memcmp(proto.base, ident->base, proto.len) == 0) { goto Is_Http2; } } /* connect as http1 */ h2o_http1_accept(ctx, sock); return; Is_Http2: /* connect as http2 */ h2o_http2_accept(ctx, sock); }
static void on_ssl_handshake_complete(h2o_socket_t *sock, int status) { struct st_h2o_accept_data_t *data = sock->data; sock->data = NULL; if (status != 0) { h2o_socket_close(sock); goto Exit; } h2o_iovec_t proto = h2o_socket_ssl_get_selected_protocol(sock); const h2o_iovec_t *ident; for (ident = h2o_http2_alpn_protocols; ident->len != 0; ++ident) { if (proto.len == ident->len && memcmp(proto.base, ident->base, proto.len) == 0) { /* connect as http2 */ h2o_http2_accept(data->ctx, sock, data->connected_at); goto Exit; } } /* connect as http1 */ h2o_http1_accept(data->ctx, sock, data->connected_at); Exit: free_accept_data(data); }
void on_accept_timeout(h2o_timeout_entry_t *entry) { /* TODO log */ struct st_h2o_accept_data_t *data = H2O_STRUCT_FROM_MEMBER(struct st_h2o_accept_data_t, timeout, entry); h2o_socket_t *sock = data->sock; free_accept_data(data); h2o_socket_close(sock); }
void on_accept_timeout(h2o_timeout_entry_t *entry) { /* TODO log */ struct st_h2o_accept_data_t *data = H2O_STRUCT_FROM_MEMBER(struct st_h2o_accept_data_t, timeout, entry); if (data->async_resumption_get_req != NULL) { h2o_memcached_cancel_get(async_resumption_context.memc, data->async_resumption_get_req); data->async_resumption_get_req = NULL; } h2o_socket_t *sock = data->sock; free_accept_data(data); h2o_socket_close(sock); }