inline bool downloadContent() { if(header.iposition("\r\nTransfer-Encoding: chunked\r\n")) { while(true) { unsigned length = hex(downloadChunkLength()); if(length == 0) break; while(length) { char buffer[2048]; int packetlength = recv(serversocket, buffer, min(sizeof(buffer), length), 0); if(packetlength <= 0) break; total_read += packetlength; length -= packetlength; write_cb(buffer, packetlength); if(progress_cb && !progress_cb(total_read, total_length)) return false; } } } else if(auto position = header.iposition("\r\nContent-Length: ")) { unsigned length = decimal((const char*)header + position() + 18); total_length = length; while(length) { char buffer[2048]; int packetlength = recv(serversocket, buffer, min(sizeof(buffer), length), 0); if(packetlength <= 0) break; total_read += packetlength; length -= packetlength; write_cb(buffer, packetlength); if(progress_cb && !progress_cb(total_read, total_length)) return false; } if(total_read < total_length) return false; } else { while(true) { char buffer[2048]; int packetlength = recv(serversocket, buffer, 2048, 0); if(packetlength <= 0) break; total_read += packetlength; write_cb(buffer, packetlength); if(progress_cb && !progress_cb(total_read, total_length)) return false; } } return true; }
inline void downloadContent(uint8_t *&data, unsigned &size) { unsigned capacity = 0; if(header.iposition("\r\nTransfer-Encoding: chunked\r\n")) { while(true) { unsigned length = hex(downloadChunkLength()); if(length == 0) break; capacity += length; data = (uint8_t*)realloc(data, capacity); char buffer[length]; while(length) { int packetlength = recv(serversocket, buffer, length, 0); if(packetlength <= 0) break; memcpy(data + size, buffer, packetlength); size += packetlength; length -= packetlength; } } } else if(auto position = header.iposition("\r\nContent-Length: ")) { unsigned length = decimal((const char*)header + position() + 18); while(length) { char buffer[256]; int packetlength = recv(serversocket, buffer, min(256, length), 0); if(packetlength <= 0) break; capacity += packetlength; data = (uint8_t*)realloc(data, capacity); memcpy(data + size, buffer, packetlength); size += packetlength; length -= packetlength; } } else { while(true) { char buffer[256]; int packetlength = recv(serversocket, buffer, 256, 0); if(packetlength <= 0) break; capacity += packetlength; data = (uint8_t*)realloc(data, capacity); memcpy(data + size, buffer, packetlength); size += packetlength; } } data = (uint8_t*)realloc(data, capacity + 1); data[capacity] = 0; }