static size_t lookup_target(h2o_socketpool_t *pool, h2o_url_t *url) { uint16_t port = h2o_url_get_port(url); size_t i = 0; for (; i != pool->targets.size; ++i) { h2o_socketpool_target_t *target = pool->targets.entries[i]; if (target->url.scheme != url->scheme) continue; if (h2o_url_get_port(&target->url) != port) continue; if (!h2o_url_hosts_are_equal(&target->url, url)) continue; return i; } return SIZE_MAX; }
static h2o_iovec_t rewrite_location(h2o_mem_pool_t *pool, const char *location, size_t location_len, h2o_url_t *match, const h2o_url_scheme_t *req_scheme, h2o_iovec_t req_authority, h2o_iovec_t req_basepath) { h2o_url_t loc_parsed; if (h2o_url_parse(location, location_len, &loc_parsed) != 0) goto NoRewrite; if (loc_parsed.scheme != &H2O_URL_SCHEME_HTTP) goto NoRewrite; if (!h2o_url_hosts_are_equal(&loc_parsed, match)) goto NoRewrite; if (h2o_url_get_port(&loc_parsed) != h2o_url_get_port(match)) goto NoRewrite; if (loc_parsed.path.len < match->path.len) goto NoRewrite; if (memcmp(loc_parsed.path.base, match->path.base, match->path.len) != 0) goto NoRewrite; return h2o_concat(pool, req_scheme->name, h2o_iovec_init(H2O_STRLIT("://")), req_authority, req_basepath, h2o_iovec_init(loc_parsed.path.base + match->path.len, loc_parsed.path.len - match->path.len)); NoRewrite: return (h2o_iovec_t){NULL}; }