bool HTTPServer_Impl::read_lines(TCPConnection &connection, std::string &out_header_lines) { out_header_lines.clear(); while (out_header_lines.length() < 32*1024) { char buffer[1024]; if (connection.get_read_event().wait(15000) == false) throw Exception("Read timed out"); int bytes_read = connection.peek(buffer, 1024); if (bytes_read <= 0) break; std::string str(buffer, bytes_read); std::string::size_type start_pos = out_header_lines.length(); out_header_lines += str; std::string::size_type pos = out_header_lines.find("\r\n\r\n"); if (pos == std::string::npos) { connection.receive(buffer, bytes_read); } else { connection.receive(buffer, pos+4-start_pos); out_header_lines.resize(pos+4); return true; } } return false; }
void run() { const char* testData = "Twenty-five or six to four"; const size_t testDataLen = strlen(testData); char* buff = reinterpret_cast<char*>(calloc(testDataLen + 1, 1)); const int port = 1337; try { // Create a listener and a client connection TCPListener server(port); TCPConnection client; // Start the server and connect to it server.start(); client.connect(IPEndPoint(IP(127, 0, 0, 1), port)); // Accept the connection auto serverConn = server.accept(); // Test sending from the server to the client serverConn->send(testData, testDataLen); client.receive(buff, testDataLen); if (strcmp(testData, buff) != 0) throw TestFailedException("Data sent from server to client didn't go through properly"); // Reset the buffer and try sending from // the client to the server memset(buff, 0, testDataLen); serverConn->shutDownSending(); client.shutDownReceiving(); client.send(testData, testDataLen); serverConn->receive(buff, testDataLen); if (strcmp(testData, buff) != 0) throw TestFailedException("Data sent from client to server didn't go through properly"); // Shut down the connections client.disconnect(); if (serverConn->receive(buff, testDataLen) != 0) throw TestFailedException("The server was not notified when the client disconnected"); serverConn->disconnect(); free(buff); } catch (...) { free(buff); throw; } }