/* Build the IO vector. Return the count of bytes to be written. Return -1 for EOF. */ static MprOff buildNetVec(HttpQueue *q) { HttpConn *conn; HttpTx *tx; HttpPacket *packet; conn = q->conn; tx = conn->tx; /* Examine each packet and accumulate as many packets into the I/O vector as possible. Leave the packets on the queue for now, they are removed after the IO is complete for the entire packet. */ for (packet = q->first; packet; packet = packet->next) { if (packet->flags & HTTP_PACKET_HEADER) { if (tx->chunkSize <= 0 && q->count > 0 && tx->length < 0) { /* Incase no chunking filter and we've not seen all the data yet */ conn->keepAliveCount = 0; } httpWriteHeaders(conn, packet); q->count += httpGetPacketLength(packet); } else if (httpGetPacketLength(packet) == 0) { q->flags |= HTTP_QUEUE_EOF; if (packet->prefix == NULL) { break; } } if (q->ioIndex >= (HTTP_MAX_IOVEC - 2)) { break; } addPacketForNet(q, packet); } return q->ioCount; }
/* * Build the IO vector. Return the count of bytes to be written. Return -1 for EOF. */ static int64 buildNetVec(MaQueue *q) { MaConn *conn; MaResponse *resp; MaPacket *packet; conn = q->conn; resp = conn->response; /* * Examine each packet and accumulate as many packets into the I/O vector as possible. Leave the packets on the queue * for now, they are removed after the IO is complete for the entire packet. */ for (packet = q->first; packet; packet = packet->next) { if (packet->flags & MA_PACKET_HEADER) { if (resp->chunkSize <= 0 && q->count > 0 && resp->length < 0) { /* Incase no chunking filter and we've not seen all the data yet */ conn->keepAliveCount = 0; } maFillHeaders(conn, packet); q->count += maGetPacketLength(packet); } else if (maGetPacketLength(packet) == 0) { q->flags |= MA_QUEUE_EOF; if (packet->prefix == NULL) { break; } } else if (resp->flags & MA_RESP_NO_BODY) { maDiscardData(q, 0); continue; } if (q->ioIndex >= (MA_MAX_IOVEC - 2)) { break; } addPacketForNet(q, packet); } return q->ioCount; }