void h2o_proxy_register_reverse_proxy(h2o_pathconf_t *pathconf, h2o_url_t *upstream, h2o_proxy_config_vars_t *config) { struct rp_handler_t *self = (void *)h2o_create_handler(pathconf, sizeof(*self)); self->super.on_context_init = on_context_init; self->super.on_context_dispose = on_context_dispose; self->super.dispose = on_handler_dispose; self->super.on_req = on_req; if (config->keepalive_timeout != 0) { self->sockpool = h2o_mem_alloc(sizeof(*self->sockpool)); struct sockaddr_un sa; const char *to_sa_err; int is_ssl = upstream->scheme == &H2O_URL_SCHEME_HTTPS; if ((to_sa_err = h2o_url_host_to_sun(upstream->host, &sa)) == h2o_url_host_to_sun_err_is_not_unix_socket) { h2o_socketpool_init_by_hostport(self->sockpool, upstream->host, h2o_url_get_port(upstream), is_ssl, SIZE_MAX /* FIXME */); } else { assert(to_sa_err == NULL); h2o_socketpool_init_by_address(self->sockpool, (void *)&sa, sizeof(sa), is_ssl, SIZE_MAX /* FIXME */); } } h2o_url_copy(NULL, &self->upstream, upstream); h2o_strtolower(self->upstream.host.base, self->upstream.host.len); self->config = *config; if (self->config.ssl_ctx != NULL) CRYPTO_add(&self->config.ssl_ctx->references, 1, CRYPTO_LOCK_SSL_CTX); }
void h2o_socketpool_init_by_hostport(h2o_socketpool_t *pool, h2o_iovec_t host, uint16_t port, size_t capacity) { struct sockaddr_in sin = {}; if (h2o_hostinfo_aton(host, &sin.sin_addr) == 0) { sin.sin_family = AF_INET; sin.sin_port = htons(port); h2o_socketpool_init_by_address(pool, (void *)&sin, sizeof(sin), capacity); return; } common_init(pool, H2O_SOCKETPOOL_TYPE_NAMED, capacity); pool->peer.named.host = h2o_strdup(NULL, host.base, host.len); pool->peer.named.port.base = h2o_mem_alloc(sizeof("65535")); pool->peer.named.port.len = sprintf(pool->peer.named.port.base, "%u", (unsigned)port); }
void h2o_socketpool_init_by_hostport(h2o_socketpool_t *pool, h2o_iovec_t host, uint16_t port, int is_ssl, size_t capacity) { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); if (h2o_hostinfo_aton(host, &sin.sin_addr) == 0) { sin.sin_family = AF_INET; sin.sin_port = htons(port); h2o_socketpool_init_by_address(pool, (void *)&sin, sizeof(sin), is_ssl, capacity); return; } common_init(pool, H2O_SOCKETPOOL_TYPE_NAMED, host, is_ssl, capacity); pool->peer.named_serv.base = h2o_mem_alloc(sizeof(H2O_UINT16_LONGEST_STR)); pool->peer.named_serv.len = sprintf(pool->peer.named_serv.base, "%u", (unsigned)port); }