liGnuTLSFilter* li_gnutls_filter_new( liServer *srv, liWorker *wrk, const liGnuTLSFilterCallbacks *callbacks, gpointer data, gnutls_session_t session, liStream *crypt_source, liStream *crypt_drain ) { liEventLoop *loop = crypt_source->loop; liGnuTLSFilter *f; liCQLimit *out_limit; f = g_slice_new0(liGnuTLSFilter); f->refcount = 5; /* 1 + 4 streams */ f->callbacks = callbacks; f->callback_data = data; f->srv = srv; f->wrk = wrk; f->session = session; gnutls_transport_set_ptr(f->session, (gnutls_transport_ptr_t) f); gnutls_transport_set_push_function(f->session, stream_push); #ifdef HAVE_GIOVEC gnutls_transport_set_vec_push_function(f->session, stream_pushv); #endif gnutls_transport_set_pull_function(f->session, stream_pull); gnutls_session_set_ptr(f->session, f); gnutls_handshake_set_post_client_hello_function(f->session, post_client_hello_cb); f->initial_handshaked_finished = 0; f->closing = f->aborted = 0; f->write_wants_read = 0; li_stream_init(&f->crypt_source, loop, stream_crypt_source_cb); li_stream_init(&f->crypt_drain, loop, stream_crypt_drain_cb); li_stream_init(&f->plain_source, loop, stream_plain_source_cb); li_stream_init(&f->plain_drain, loop, stream_plain_drain_cb); /* "virtual" connections - the content goes through SSL */ li_stream_connect(&f->plain_drain, &f->crypt_source); li_stream_connect(&f->crypt_drain, &f->plain_source); li_stream_connect(crypt_source, &f->crypt_drain); li_stream_connect(&f->crypt_source, crypt_drain); /* separate limit for buffer of encrypted data * * f->plain_drain is already connected to f->crypt_source, * so they won't share the same limit */ out_limit = li_cqlimit_new(); out_limit->notify = stream_crypt_source_limit_notify_cb; out_limit->context = f; li_cqlimit_set_limit(out_limit, 32*1024); li_chunkqueue_set_limit(crypt_drain->out, out_limit); li_chunkqueue_set_limit(f->crypt_source.out, out_limit); li_cqlimit_release(out_limit); return f; }
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); }