| 
					
				 | 
			
			
				@@ -13,9 +13,7 @@ void HTTPClient::HTTPResponse::close() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	bufPtr = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 HTTPClient::HTTPResponse::~HTTPResponse() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	socket = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if (buf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		free(buf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	this->close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 HTTPResponse_t HTTPClient::execute(const struct HTTPRequest &request) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -70,10 +68,12 @@ HTTPResponse_t HTTPClient::executeImpl(const struct HTTPRequest &request, HTTPRe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		stream << header.first << ": " << header.second << endl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	stream << endl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	stream << request.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (request.body != nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            stream << request.body; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	std::string data = stream.str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t len = response->socket->write((uint8_t *)data.c_str(), data.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t len = response->socket->write((uint8_t *)data.c_str(), data.size()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (len != data.size()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		response->close(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		BELL_LOG(error, "http", "Writing failed: wrote %d of %d bytes", len, data.size()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -91,7 +91,7 @@ HTTPResponse_t HTTPClient::executeImpl(const struct HTTPRequest &request, HTTPRe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 bool HTTPClient::readHeader(const char *&header, const char *name) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t len = strlen(name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t len = strlen(name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (strncasecmp(header, name, len) == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		header += len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		while (*header == ' ') 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -101,8 +101,13 @@ bool HTTPClient::readHeader(const char *&header, const char *name) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-size_t HTTPClient::HTTPResponse::readRaw(char *dst) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t len = this->socket->read((uint8_t *)dst, BUF_SIZE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+uint32_t HTTPClient::HTTPResponse::readRaw(char *dst) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!this->socket) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 0; // socket is already closed, I guess 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t len = this->socket->read((uint8_t *)dst, BUF_SIZE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (len == 0 || len == -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		isComplete = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (dumpRawFs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		dumpRawFs->write(dst, (long)len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	//	BELL_LOG(debug, "http", "Read %d bytes", len); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -111,7 +116,7 @@ size_t HTTPClient::HTTPResponse::readRaw(char *dst) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void HTTPClient::HTTPResponse::readHeaders() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	char *line, *lineEnd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	bool complete = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	std::string lineBuf; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -185,8 +190,8 @@ void HTTPClient::HTTPResponse::readHeaders() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} while (!complete && len); // if len == 0, the connection is closed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-bool HTTPClient::HTTPResponse::skipRaw(size_t len, bool dontRead) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t skip = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bool HTTPClient::HTTPResponse::skipRaw(uint32_t len, bool dontRead) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t skip = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (len > bufRemaining) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		skip = len - bufRemaining; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		len = bufRemaining; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -211,16 +216,17 @@ bool HTTPClient::HTTPResponse::skipRaw(size_t len, bool dontRead) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-size_t HTTPClient::HTTPResponse::read(char *dst, size_t toRead, bool wait) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+uint32_t HTTPClient::HTTPResponse::read(char *dst, uint32_t toRead, bool wait) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if (isComplete) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// end of chunked stream was found OR complete body was read 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	auto *dstStart = dst ? dst : nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t read = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t read = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	while (toRead) { // this loop ends after original toRead 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		skipRaw(0);	 // ensure the buffer contains data, wait if necessary 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if (isChunked && !chunkRemaining) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// chunked responses (either streaming or not) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (*bufPtr == '0') { // all chunks were read *and emitted* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				isComplete = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				break; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -241,11 +247,15 @@ size_t HTTPClient::HTTPResponse::read(char *dst, size_t toRead, bool wait) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (!skipRaw(endPtr - bufPtr + 2)) // skip the size and \r\n 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				break;						   // -> no more data, break out of main loop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else if (contentLength && !chunkRemaining) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// normal responses (having content-length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			chunkRemaining = contentLength; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else if (!chunkRemaining) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// fallback for non-chunked streams (without content-length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			chunkRemaining = toRead; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		while (chunkRemaining && toRead) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			size_t count = std::min(toRead, std::min(bufRemaining, chunkRemaining)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			uint32_t count = std::min(toRead, std::min(bufRemaining, chunkRemaining)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (dst) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				memcpy(dst, bufPtr, count); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				dst += count; // move the dst pointer 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -287,8 +297,8 @@ std::string HTTPClient::HTTPResponse::readToString() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	std::string result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        char buffer[BUF_SIZE+1]; // make space for null-terminator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	size_t len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	char buffer[BUF_SIZE + 1]; // make space for null-terminator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	uint32_t len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	do { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		len = this->read(buffer, BUF_SIZE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		buffer[len] = '\0'; 
			 |