MCPcopy Create free account
hub / github.com/apache/trafficserver / PassthruSessionEvent

Function PassthruSessionEvent

example/plugins/c-api/passthru/passthru.cc:186–276  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

184}
185
186static int
187PassthruSessionEvent(TSCont cont, TSEvent event, void *edata)
188{
189 EventArgument arg(edata);
190 PassthruSession *sp = static_cast<PassthruSession *>(TSContDataGet(cont));
191
192 PassthruSessionDebug(sp, "session event on vconn=%p event=%d (%s)", TSVIOVConnGet(arg.vio), event, TSHttpEventNameLookup(event));
193
194 if (event == TS_EVENT_VCONN_READ_READY) {
195 // On the first read, wire up the internal transfer to the server.
196 if (sp->server.vconn == nullptr) {
197 sp->server.vconn = TSHttpConnectWithPluginId(TSNetVConnRemoteAddrGet(sp->client.vconn), PLUGIN_NAME, 0);
198
199 TSReleaseAssert(sp->server.vconn != nullptr);
200
201 // Start the server end of the IO before we write any data.
202 sp->server.readio.read(sp->server.vconn, sp->contp);
203 sp->server.writeio.write(sp->server.vconn, sp->contp);
204 }
205
206 int64_t nbytes;
207
208 nbytes = sp->client.readio.transfer_to(sp->server.writeio);
209 PassthruSessionDebug(sp, "proxied %" PRId64 " bytes from client vconn=%p to server vconn=%p", nbytes, sp->client.vconn,
210 sp->server.vconn);
211 if (nbytes) {
212 TSVIOReenable(sp->client.readio.vio);
213 TSVIOReenable(sp->server.writeio.vio);
214 }
215
216 nbytes = sp->server.readio.transfer_to(sp->client.writeio);
217 PassthruSessionDebug(sp, "proxied %" PRId64 " bytes from server vconn=%p to client vconn=%p", nbytes, sp->server.vconn,
218 sp->client.vconn);
219 if (nbytes) {
220 TSVIOReenable(sp->server.readio.vio);
221 TSVIOReenable(sp->client.writeio.vio);
222 }
223
224 if (PassthruSessionIsFinished(sp)) {
225 delete sp;
226 return TS_EVENT_NONE;
227 }
228
229 TSVIOReenable(arg.vio);
230 return TS_EVENT_NONE;
231 }
232
233 if (event == TS_EVENT_VCONN_WRITE_READY) {
234 if (PassthruSessionIsFinished(sp)) {
235 delete sp;
236 return TS_EVENT_NONE;
237 }
238
239 return TS_EVENT_NONE;
240 }
241
242 if (event == TS_EVENT_VCONN_EOS) {
243 // If we get EOS from the client, just abort everything; we don't

Callers

nothing calls this directly

Calls 14

TSContDataGetFunction · 0.85
TSVIOVConnGetFunction · 0.85
TSHttpEventNameLookupFunction · 0.85
TSNetVConnRemoteAddrGetFunction · 0.85
TSVIOReenableFunction · 0.85
TSIOBufferReaderAvailFunction · 0.85
TSVConnCloseFunction · 0.85
transfer_toMethod · 0.80
TSErrorFunction · 0.50
readMethod · 0.45

Tested by

no test coverage detected