static void proxy_io_cb(liIOStream *stream, liIOStreamEvent event) { proxy_connection *con = stream->data; liWorker *wrk = li_worker_from_iostream(stream); li_stream_simple_socket_io_cb_with_context(stream, event, &con->simple_socket_data); switch (event) { case LI_IOSTREAM_DESTROY: li_stream_simple_socket_close(stream, FALSE); li_event_io_set_fd(&con->bcon->watcher, -1); li_backend_put(wrk, con->ctx->pool, con->bcon, TRUE); con->bcon = NULL; proxy_context_release(con->ctx); g_slice_free(proxy_connection, con); stream->data = NULL; return; default: break; } if ((NULL == stream->stream_in.out || stream->stream_in.out->is_closed) && !(NULL == stream->stream_out.out || stream->stream_out.out->is_closed)) { stream->stream_out.out->is_closed = TRUE; li_stream_again_later(&stream->stream_out); } }
static void proxy_connection_free(proxy_connection *pcon) { liVRequest *vr; if (!pcon) return; vr = pcon->vr; ev_io_stop(vr->wrk->loop, &pcon->fd_watcher); proxy_context_release(pcon->ctx); if (pcon->fd != -1) close(pcon->fd); li_vrequest_backend_finished(vr); li_chunkqueue_free(pcon->proxy_in); li_chunkqueue_free(pcon->proxy_out); li_buffer_release(pcon->proxy_in_buffer); li_http_response_parser_clear(&pcon->parse_response_ctx); g_slice_free(proxy_connection, pcon); }
static void proxy_free(liServer *srv, gpointer param) { proxy_context *ctx = (proxy_context*) param; UNUSED(srv); proxy_context_release(ctx); }