ssize_t h2o_set_header_by_str(h2o_mem_pool_t *pool, h2o_headers_t *headers, const char *name, size_t name_len, int maybe_token, const char *value, size_t value_len, int overwrite_if_exists) { ssize_t cursor; if (maybe_token) { const h2o_token_t *token = h2o_lookup_token(name, name_len); if (token != NULL) { return h2o_set_header(pool, headers, token, value, value_len, overwrite_if_exists); } } cursor = h2o_find_header_by_str(headers, name, name_len, -1); if (cursor != -1) { if (overwrite_if_exists) { h2o_iovec_t *slot = &headers->entries[cursor].value; slot->base = (char *)value; slot->len = value_len; } return cursor; } else { h2o_iovec_t *name_buf = h2o_mem_alloc_pool(pool, *name_buf, 1); name_buf->base = (char *)name; name_buf->len = name_len; return add_header(pool, headers, name_buf, NULL, value, value_len, (h2o_header_flags_t){0}); } }
void h2o_set_header_by_str(h2o_mempool_t *pool, h2o_headers_t *headers, const char *name, size_t name_len, int maybe_token, const char *value, size_t value_len, int overwrite_if_exists) { ssize_t cursor; if (maybe_token) { const h2o_token_t *token = h2o_lookup_token(name, name_len); if (token != NULL) { h2o_set_header(pool, headers, token ,value, value_len, overwrite_if_exists); return; } } cursor = h2o_find_header_by_str(headers, name, name_len, -1); if (cursor != -1) { if (overwrite_if_exists) { h2o_buf_t *slot = &headers->entries[cursor].value; slot->base = (char*)value; slot->len = value_len; } } else { h2o_buf_t *name_buf = h2o_mempool_alloc(pool, sizeof(h2o_buf_t)); name_buf->base = (char*)name; name_buf->len = name_len; add_header(pool, headers, name_buf, value, value_len); } }
static void send_chunk(h2o_ostream_t *_self, h2o_req_t *req, h2o_buf_t *inbufs, size_t inbufcnt, int is_final) { struct rproxy_t *self = (void*)_self; const char *host, *path; uint16_t port; /* throw away all data */ if (! is_final) { h2o_ostream_send_next(&self->super, req, NULL, 0, 0); return; } /* end of the original stream, start retreiving the data from the reproxy-url */ if (! parse_url(&req->pool, self->reproxy_url, &host, &port, &path)) { host = NULL; path = NULL; port = 0; } /* NOT IMPLEMENTED!!! */ h2o_buf_t body = h2o_sprintf( &req->pool, "reproxy request to URL: %s\n" " host: %s\n" " port: %u\n" " path: %s\n", self->reproxy_url, host, (int)port, path); req->res.status = 200; req->res.reason = "Internal Server Error"; req->res.content_length = SIZE_MAX; h2o_set_header(&req->pool, &req->res.headers, H2O_TOKEN_CONTENT_TYPE, H2O_STRLIT("text/plain; charset=utf-8"), 1); h2o_setup_next_ostream(self->filter, req, &self->super.next); assert(is_final); h2o_ostream_send_next(&self->super, req, &body, 1, is_final); }