Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}