/* Converts a session in memory to on-disk format. */ static void makeRecord(Writer <HTTPSession>::Record &record, const HTTPSession &session) { /* Record version. */ record += version; /* Client Ethernet address. */ record.append(session.clientMAC, ETHER_ADDR_LEN); /* Server Ethernet address. */ record.append(session.serverMAC, ETHER_ADDR_LEN); /* Client IP. */ record += session.clientIP; /* Server IP. */ record += session.serverIP; /* Client port. */ record += session.clientPort; /* Server port. */ record += session.serverPort; /* Compression (off for now). */ record += (uint8_t)0; /* Number of messages. */ record += htonl((uint32_t)(session.requests.size() + session.responses.size())); /* Requests. */ for (size_t i = 0; i < session.requests.size(); ++i) { /* Message type. */ record += (uint8_t)session.requests[i].type; /* Time (seconds). */ record += htonl(session.requests[i].time.seconds()); /* Time (microseconds). */ record += htonl(session.requests[i].time.microseconds()); /* Number of message components. */ record += htonl((uint32_t)session.requests[i].message.size()); for (size_t j = 0; j < session.requests[i].message.size(); ++j) { /* Message component size. */ record += htonl((uint32_t)session.requests[i].message[j].size()); /* Message compnent. */ record += session.requests[i].message[j]; } /* Number of headers. */ record += htonl((uint32_t)session.requests[i].headers.size()); for (size_t j = 0; j < session.requests[i].headers.size(); ++j) { /* Header field size. */ record += htonl((uint32_t)session.requests[i].headers[j].first.size()); /* Header field. */ record += session.requests[i].headers[j].first; /* Header value size. */ record += htonl((uint32_t)session.requests[i].headers[j].second.size()); /* Header value. */ record += session.requests[i].headers[j].second; } } /* Responses. */ for (size_t i = 0; i < session.responses.size(); ++i) { /* Message type. */ record += (uint8_t)session.responses[i].type; /* Time (seconds). */ record += htonl(session.responses[i].time.seconds()); /* Time (microseconds). */ record += htonl(session.responses[i].time.microseconds()); /* Number of message components. */ record += htonl((uint32_t)session.responses[i].message.size()); for (size_t j = 0; j < session.responses[i].message.size(); ++j) { /* Message component size. */ record += htonl((uint32_t)session.responses[i].message[j].size()); /* Message compnent. */ record += session.responses[i].message[j]; } /* Number of headers. */ record += htonl((uint32_t)session.responses[i].headers.size()); for (size_t j = 0; j < session.responses[i].headers.size(); ++j) { /* Header field size. */ record += htonl((uint32_t)session.responses[i].headers[j].first.size()); /* Header field. */ record += session.responses[i].headers[j].first; /* Header value size. */ record += htonl((uint32_t)session.responses[i].headers[j].second.size()); /* Header value. */ record += session.responses[i].headers[j].second; } } }