transfer all bytes from the server (error condition)
| 84 | |
| 85 | // transfer all bytes from the server (error condition) |
| 86 | int64_t |
| 87 | transfer_all_bytes(Data *const data) |
| 88 | { |
| 89 | // nothing to transfer if there's no source. |
| 90 | if (nullptr == data->m_upstream.m_read.m_reader || !data->m_dnstream.m_write.isOpen()) { |
| 91 | return 0; |
| 92 | } |
| 93 | |
| 94 | int64_t consumed = 0; // input vio bytes visited |
| 95 | |
| 96 | TSIOBufferReader const reader = data->m_upstream.m_read.m_reader; |
| 97 | TSIOBuffer const output_buf = data->m_dnstream.m_write.m_iobuf; |
| 98 | |
| 99 | int64_t const read_avail = TSIOBufferReaderAvail(reader); |
| 100 | |
| 101 | if (0 < read_avail) { |
| 102 | int64_t const copied = TSIOBufferCopy(output_buf, reader, read_avail, 0); |
| 103 | |
| 104 | if (0 < copied) { |
| 105 | TSIOBufferReaderConsume(reader, copied); |
| 106 | consumed = copied; |
| 107 | |
| 108 | TSVIO const output_vio = data->m_dnstream.m_write.m_vio; |
| 109 | if (nullptr != output_vio) { |
| 110 | TSVIOReenable(output_vio); |
| 111 | } |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | if (0 < consumed) { |
| 116 | TSVIO const input_vio = data->m_upstream.m_read.m_vio; |
| 117 | if (nullptr != input_vio) { |
| 118 | TSVIONDoneSet(input_vio, TSVIONDoneGet(input_vio) + consumed); |
| 119 | } |
| 120 | } |
| 121 | |
| 122 | return consumed; |
| 123 | } |
no test coverage detected