| 980 | } |
| 981 | |
| 982 | static int |
| 983 | synserver_txn_write_response(TSCont contp) |
| 984 | { |
| 985 | ServerTxn *txn = static_cast<ServerTxn *>(TSContDataGet(contp)); |
| 986 | TSAssert(txn->magic == MAGIC_ALIVE); |
| 987 | |
| 988 | SET_TEST_HANDLER(txn->current_handler, synserver_txn_write_response_handler); |
| 989 | |
| 990 | TSIOBufferBlock block; |
| 991 | char *ptr_block; |
| 992 | int64_t len, ndone, ntodo, towrite, avail; |
| 993 | char *response; |
| 994 | |
| 995 | response = generate_response(txn->request); |
| 996 | len = strlen(response); |
| 997 | |
| 998 | ndone = 0; |
| 999 | ntodo = len; |
| 1000 | while (ntodo > 0) { |
| 1001 | block = TSIOBufferStart(txn->resp_buffer); |
| 1002 | ptr_block = TSIOBufferBlockWriteStart(block, &avail); |
| 1003 | towrite = std::min(ntodo, avail); |
| 1004 | memcpy(ptr_block, response + ndone, towrite); |
| 1005 | TSIOBufferProduce(txn->resp_buffer, towrite); |
| 1006 | ntodo -= towrite; |
| 1007 | ndone += towrite; |
| 1008 | } |
| 1009 | |
| 1010 | /* Start writing the response */ |
| 1011 | Dbg(dbg_ctl_SockServer, "Writing response: |%s| (%" PRId64 ") bytes)", response, len); |
| 1012 | txn->write_vio = TSVConnWrite(txn->vconn, contp, txn->resp_reader, len); |
| 1013 | |
| 1014 | /* Now that response is in IOBuffer, free up response */ |
| 1015 | TSfree(response); |
| 1016 | |
| 1017 | return TS_EVENT_IMMEDIATE; |
| 1018 | } |
| 1019 | |
| 1020 | static int |
| 1021 | synserver_txn_write_response_handler(TSCont contp, TSEvent event, void * /* data ATS_UNUSED */) |
no test coverage detected