| 184 | } |
| 185 | |
| 186 | static int |
| 187 | PassthruSessionEvent(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 |
nothing calls this directly
no test coverage detected