static void proxy_connection_new(liVRequest *vr, liBackendConnection *bcon, proxy_context *ctx) { proxy_connection* scon = g_slice_new0(proxy_connection); liIOStream *iostream; liStream *outplug; liStream *http_out; proxy_context_acquire(ctx); scon->ctx = ctx; scon->bcon = bcon; iostream = li_iostream_new(vr->wrk, li_event_io_fd(&bcon->watcher), proxy_io_cb, scon); /* insert proxy header before actual data */ outplug = li_stream_plug_new(&vr->wrk->loop); li_stream_connect(outplug, &iostream->stream_out); proxy_send_headers(vr, outplug->out); li_stream_notify_later(outplug); http_out = li_stream_http_response_handle(&iostream->stream_in, vr, TRUE, FALSE); li_vrequest_handle_indirect(vr, NULL); li_vrequest_indirect_connect(vr, outplug, http_out); li_iostream_release(iostream); li_stream_release(outplug); li_stream_release(http_out); }
static liHandlerResult proxy_handle(liVRequest *vr, gpointer param, gpointer *context) { proxy_context *ctx = (proxy_context*) param; proxy_connection *pcon; UNUSED(context); if (!li_vrequest_handle_indirect(vr, ctx->plugin)) return LI_HANDLER_GO_ON; pcon = proxy_connection_new(vr, ctx); if (!pcon) { return LI_HANDLER_ERROR; } g_ptr_array_index(vr->plugin_ctx, ctx->plugin->id) = pcon; li_chunkqueue_set_limit(pcon->proxy_in, vr->out->limit); li_chunkqueue_set_limit(pcon->proxy_out, vr->in->limit); if (vr->out->limit) vr->out->limit->io_watcher = &pcon->fd_watcher; return proxy_statemachine(vr, pcon); }
static liHandlerResult fastcgi_handle(liVRequest *vr, gpointer param, gpointer *context) { fastcgi_context *ctx = (fastcgi_context*) param; fastcgi_connection *fcon; UNUSED(context); if (!li_vrequest_handle_indirect(vr, ctx->plugin)) return LI_HANDLER_GO_ON; fcon = fastcgi_connection_new(vr, ctx); if (!fcon) { return LI_HANDLER_ERROR; } g_ptr_array_index(vr->plugin_ctx, ctx->plugin->id) = fcon; li_chunkqueue_set_limit(fcon->fcgi_in, vr->out->limit); li_chunkqueue_set_limit(fcon->stdout, vr->out->limit); li_chunkqueue_set_limit(fcon->fcgi_out, vr->in->limit); if (vr->out->limit) vr->out->limit->io_watcher = &fcon->fd_watcher; return fastcgi_statemachine(vr, fcon); }