static void on_context_init(h2o_handler_t *_self, h2o_context_t *ctx) { struct rp_handler_t *self = (void *)_self; /* use the loop of first context for handling socketpool timeouts */ if (self->sockpool != NULL && self->sockpool->timeout == UINT64_MAX) h2o_socketpool_set_timeout(self->sockpool, ctx->loop, self->config.keepalive_timeout); /* setup a specific client context only if we need to */ if (ctx->globalconf->proxy.io_timeout == self->config.io_timeout && !self->config.websocket.enabled && self->config.ssl_ctx == ctx->globalconf->proxy.ssl_ctx) return; h2o_http1client_ctx_t *client_ctx = h2o_mem_alloc(sizeof(*ctx)); client_ctx->loop = ctx->loop; client_ctx->getaddr_receiver = &ctx->receivers.hostinfo_getaddr; if (ctx->globalconf->proxy.io_timeout == self->config.io_timeout) { client_ctx->io_timeout = &ctx->proxy.io_timeout; } else { client_ctx->io_timeout = h2o_mem_alloc(sizeof(*client_ctx->io_timeout)); h2o_timeout_init(client_ctx->loop, client_ctx->io_timeout, self->config.io_timeout); } if (self->config.websocket.enabled) { /* FIXME avoid creating h2o_timeout_t for every path-level context in case the timeout values are the same */ client_ctx->websocket_timeout = h2o_mem_alloc(sizeof(*client_ctx->websocket_timeout)); h2o_timeout_init(client_ctx->loop, client_ctx->websocket_timeout, self->config.websocket.timeout); } else { client_ctx->websocket_timeout = NULL; } client_ctx->ssl_ctx = self->config.ssl_ctx; h2o_context_set_handler_context(ctx, &self->super, client_ctx); }
static void on_context_init(h2o_handler_t *_self, h2o_context_t *ctx) { struct rp_handler_t *self = (void *)_self; /* use the loop of first context for handling socketpool timeouts */ h2o_socketpool_register_loop(self->sockpool, ctx->loop); struct rp_handler_context_t *handler_ctx = h2o_mem_alloc(sizeof(*handler_ctx)); memset(handler_ctx, 0, sizeof(*handler_ctx)); h2o_httpclient_connection_pool_init(&handler_ctx->connpool, self->sockpool); h2o_context_set_handler_context(ctx, &self->super, handler_ctx); /* setup a specific client context only if we need to */ if (ctx->globalconf->proxy.io_timeout == self->config.io_timeout && ctx->globalconf->proxy.connect_timeout == self->config.connect_timeout && ctx->globalconf->proxy.first_byte_timeout == self->config.first_byte_timeout && ctx->globalconf->proxy.keepalive_timeout == self->config.keepalive_timeout && ctx->globalconf->proxy.max_buffer_size == self->config.max_buffer_size && ctx->globalconf->proxy.http2.ratio == self->config.http2.ratio && !self->config.websocket.enabled) return; h2o_httpclient_ctx_t *client_ctx = h2o_mem_alloc(sizeof(*ctx)); client_ctx->loop = ctx->loop; client_ctx->getaddr_receiver = &ctx->receivers.hostinfo_getaddr; client_ctx->io_timeout = self->config.io_timeout; client_ctx->connect_timeout = self->config.connect_timeout; client_ctx->first_byte_timeout = self->config.first_byte_timeout; client_ctx->keepalive_timeout = self->config.keepalive_timeout; if (self->config.websocket.enabled) { client_ctx->websocket_timeout = &self->config.websocket.timeout; } else { client_ctx->websocket_timeout = NULL; } client_ctx->max_buffer_size = self->config.max_buffer_size; client_ctx->http2.ratio = self->config.http2.ratio; client_ctx->http2.counter = -1; handler_ctx->client_ctx = client_ctx; }