static void transform_destroy(TSCont contp) { TransformData *data; data = TSContDataGet(contp); if (data != NULL) { if (data->input_buf) { TSIOBufferDestroy(data->input_buf); } if (data->output_buf) { TSIOBufferDestroy(data->output_buf); } if (data->pending_action) { TSActionCancel(data->pending_action); } if (data->server_vc) { TSVConnAbort(data->server_vc, 1); } TSfree(data); } else { TSError("[%s] Unable to get Continuation's Data. TSContDataGet returns NULL", PLUGIN_NAME); } TSContDestroy(contp); }
static int transform_bypass(TSCont contp, TransformData *data) { data->state = STATE_BYPASS; if (data->server_vc) { TSVConnAbort(data->server_vc, 1); data->server_vc = NULL; data->server_vio = NULL; } if (data->output_buf) { TSIOBufferDestroy(data->output_buf); data->output_buf = NULL; data->output_reader = NULL; } TSIOBufferReaderConsume(data->input_reader, sizeof(int)); data->output_vc = TSTransformOutputVConnGet((TSVConn)contp); if (data->output_vc == NULL) { TSError("[%s] TSTransformOutputVConnGet returns NULL", PLUGIN_NAME); } else { data->output_vio = TSVConnWrite(data->output_vc, contp, data->input_reader, TSIOBufferReaderAvail(data->input_reader)); if (data->output_vio == NULL) { TSError("[%s] TSVConnWrite returns NULL", PLUGIN_NAME); } } return 1; }
static int transform_read_event(TSCont contp, TransformData * data, TSEvent event, void *edata) { switch (event) { case TS_EVENT_ERROR: TSVConnAbort(data->server_vc, 1); data->server_vc = NULL; data->server_vio = NULL; TSVConnAbort(data->output_vc, 1); data->output_vc = NULL; data->output_vio = NULL; break; case TS_EVENT_VCONN_EOS: TSVConnAbort(data->server_vc, 1); data->server_vc = NULL; data->server_vio = NULL; TSVConnAbort(data->output_vc, 1); data->output_vc = NULL; data->output_vio = NULL; break; case TS_EVENT_VCONN_READ_COMPLETE: TSVConnClose(data->server_vc); data->server_vc = NULL; data->server_vio = NULL; TSVIOReenable(data->output_vio); break; case TS_EVENT_VCONN_READ_READY: TSVIOReenable(data->output_vio); break; case TS_EVENT_VCONN_WRITE_COMPLETE: TSVConnShutdown(data->output_vc, 0, 1); break; case TS_EVENT_VCONN_WRITE_READY: TSVIOReenable(data->server_vio); break; default: break; } return 0; }