TEST(EncoderTest, Response) { Request request; const OK response("body"); // Encode the response. const string encoded = HttpResponseEncoder::encode(response, request); // Now decode it back, and verify the encoding was correct. ResponseDecoder decoder; deque<Response*> responses = decoder.decode(encoded.data(), encoded.length()); ASSERT_FALSE(decoder.failed()); ASSERT_EQ(1, responses.size()); Response* decoded = responses[0]; EXPECT_EQ("200 OK", decoded->status); EXPECT_EQ("body", decoded->body); // Encoding should have inserted the 'Date' and 'Content-Length' headers. EXPECT_EQ(2, decoded->headers.size()); EXPECT_TRUE(decoded->headers.contains("Date")); EXPECT_SOME_EQ( stringify(response.body.size()), decoded->headers.get("Content-Length")); }
TEST(DecoderTest, Response) { ResponseDecoder decoder; const string data = "HTTP/1.1 200 OK\r\n" "Date: Fri, 31 Dec 1999 23:59:59 GMT\r\n" "Content-Type: text/plain\r\n" "Content-Length: 2\r\n" "\r\n" "hi"; deque<Response*> responses = decoder.decode(data.data(), data.length()); ASSERT_FALSE(decoder.failed()); ASSERT_EQ(1, responses.size()); Response* response = responses[0]; EXPECT_EQ("200 OK", response->status); EXPECT_EQ(Response::BODY, response->type); EXPECT_EQ("hi", response->body); EXPECT_EQ(3, response->headers.size()); delete response; }
Future<Response> decode(const string& buffer) { ResponseDecoder decoder; deque<Response*> responses = decoder.decode(buffer.c_str(), buffer.length()); if (decoder.failed() || responses.empty()) { for (size_t i = 0; i < responses.size(); ++i) { delete responses[i]; } return Failure("Failed to decode HTTP response:\n" + buffer + "\n"); } else if (responses.size() > 1) { PLOG(ERROR) << "Received more than 1 HTTP Response"; } Response response = *responses[0]; for (size_t i = 0; i < responses.size(); ++i) { delete responses[i]; } return response; }