summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/flip/flip_network_transaction_unittest.cc138
-rw-r--r--net/flip/flip_session.cc7
-rw-r--r--net/flip/flip_session.h3
3 files changed, 126 insertions, 22 deletions
diff --git a/net/flip/flip_network_transaction_unittest.cc b/net/flip/flip_network_transaction_unittest.cc
index fb711b1..84e0e78 100644
--- a/net/flip/flip_network_transaction_unittest.cc
+++ b/net/flip/flip_network_transaction_unittest.cc
@@ -88,25 +88,25 @@ class FlipNetworkTransactionTest : public PlatformTest {
protected:
void KeepAliveConnectionResendRequestTest(const MockRead& read_failure);
- struct SimpleGetHelperResult {
+ struct TransactionHelperResult {
int rv;
std::string status_line;
std::string response_data;
};
- SimpleGetHelperResult SimpleGetHelper(MockRead data_reads[]) {
- SimpleGetHelperResult out;
+ TransactionHelperResult TransactionHelper(const HttpRequestInfo& request,
+ MockRead reads[],
+ MockWrite writes[]) {
+ TransactionHelperResult out;
+
+ // We disable SSL for this test.
+ FlipSession::SetSSLMode(false);
SessionDependencies session_deps;
scoped_ptr<FlipNetworkTransaction> trans(
new FlipNetworkTransaction(CreateSession(&session_deps)));
- HttpRequestInfo request;
- request.method = "GET";
- request.url = GURL("http://www.google.com/");
- request.load_flags = 0;
-
- StaticMockSocket data(data_reads, NULL);
+ StaticMockSocket data(reads, writes);
session_deps.socket_factory.AddMockSocket(&data);
TestCompletionCallback callback;
@@ -144,7 +144,20 @@ TEST_F(FlipNetworkTransactionTest, Constructor) {
scoped_ptr<HttpTransaction> trans(new FlipNetworkTransaction(session));
}
-TEST_F(FlipNetworkTransactionTest, Connect) {
+TEST_F(FlipNetworkTransactionTest, Get) {
+ static const unsigned char syn[] = {
+ 0x80, 0x01, 0x00, 0x01, // header
+ 0x01, 0x00, 0x00, 0x30, // FIN, len
+ 0x00, 0x00, 0x00, 0x01, // stream id
+ 0xc0, 0x00, 0x00, 0x03, // 4 headers
+ 0x00, 0x06, 'm', 'e', 't', 'h', 'o', 'd', // "hello"
+ 0x00, 0x03, 'G', 'E', 'T', // "bye"
+ 0x00, 0x03, 'u', 'r', 'l', // "url"
+ 0x00, 0x01, '/', // "/"
+ 0x00, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n', // "status"
+ 0x00, 0x08, 'H', 'T', 'T', 'P', '/', '1', '.', '1', // "200"
+ };
+
static const unsigned char syn_reply[] = {
0x80, 0x01, 0x00, 0x02, // header
0x00, 0x00, 0x00, 0x45,
@@ -171,17 +184,103 @@ TEST_F(FlipNetworkTransactionTest, Connect) {
0x00, 0x00, 0x00, 0x00,
};
+ MockWrite writes[] = {
+ MockWrite(true, reinterpret_cast<const char*>(syn), sizeof(syn)),
+ };
+
+ MockRead reads[] = {
+ MockRead(true, reinterpret_cast<const char*>(syn_reply), sizeof(syn_reply)),
+ MockWrite(true, reinterpret_cast<const char*>(body_frame),
+ sizeof(body_frame)),
+ MockWrite(true, reinterpret_cast<const char*>(fin_frame),
+ sizeof(fin_frame)),
+ MockRead(true, 0, 0) // EOF
+ };
+
+ HttpRequestInfo request;
+ request.method = "GET";
+ request.url = GURL("http://www.google.com/");
+ request.load_flags = 0;
+ TransactionHelperResult out = TransactionHelper(request, reads, writes);
+ EXPECT_EQ(OK, out.rv);
+ EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
+ EXPECT_EQ("hello!", out.response_data);
+}
+
+// Test that a simple POST works.
+TEST_F(FlipNetworkTransactionTest, Post) {
+ static const char upload[] = { "hello world" };
+
+ // Setup the request
+ HttpRequestInfo request;
+ request.method = "POST";
+ request.url = GURL("http://www.google.com/");
+ request.upload_data = new UploadData();
+ request.upload_data->AppendBytes(upload, sizeof(upload));
+
+ // TODO(mbelshe): Hook up the write validation.
+
+ //static const unsigned char syn[] = {
+ // 0x80, 0x01, 0x00, 0x01, // header
+ // 0x00, 0x00, 0x00, 0x30, // FIN, len
+ // 0x00, 0x00, 0x00, 0x01, // stream id
+ // 0xc0, 0x00, 0x00, 0x03, // 4 headers
+ // 0x00, 0x06, 'm', 'e', 't', 'h', 'o', 'd', // "hello"
+ // 0x00, 0x03, 'G', 'E', 'T', // "bye"
+ // 0x00, 0x03, 'u', 'r', 'l', // "url"
+ // 0x00, 0x01, '/', // "/"
+ // 0x00, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n', // "status"
+ // 0x00, 0x08, 'H', 'T', 'T', 'P', '/', '1', '.', '1', // "200"
+ //};
+
+ //static const unsigned char upload_frame[] = {
+ // 0x00, 0x00, 0x00, 0x01, // header
+ // 0x01, 0x00, 0x00, 0x06, // FIN flag
+ // 'h', 'e', 'l', 'l', 'o', '!', // "hello"
+ //};
+
+ // The response
+ static const unsigned char syn_reply[] = {
+ 0x80, 0x01, 0x00, 0x02, // header
+ 0x00, 0x00, 0x00, 0x45,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x04, // 4 headers
+ 0x00, 0x05, 'h', 'e', 'l', 'l', 'o', // "hello"
+ 0x00, 0x03, 'b', 'y', 'e', // "bye"
+ 0x00, 0x06, 's', 't', 'a', 't', 'u', 's', // "status"
+ 0x00, 0x03, '2', '0', '0', // "200"
+ 0x00, 0x03, 'u', 'r', 'l', // "url"
+ 0x00, 0x0a, '/', 'i', 'n', 'd', 'e', 'x', '.', 'p', 'h', 'p', // "HTTP/1.1"
+ 0x00, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n', // "version"
+ 0x00, 0x08, 'H', 'T', 'T', 'P', '/', '1', '.', '1', // "HTTP/1.1"
+ };
+ static const unsigned char body_frame[] = {
+ 0x00, 0x00, 0x00, 0x01, // header
+ 0x00, 0x00, 0x00, 0x06,
+ 'h', 'e', 'l', 'l', 'o', '!', // "hello"
+ };
+ static const unsigned char fin_frame[] = {
+ 0x80, 0x01, 0x00, 0x03, // header
+ 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00,
+ };
+
+ //MockWrite writes[] = {
+ // MockWrite(true, reinterpret_cast<const char*>(syn), sizeof(syn)),
+ // MockWrite(true, reinterpret_cast<const char*>(upload_frame),
+ // sizeof(upload_frame)),
+ //};
+
MockRead data_reads[] = {
MockRead(true, reinterpret_cast<const char*>(syn_reply), sizeof(syn_reply)),
MockRead(true, reinterpret_cast<const char*>(body_frame),
sizeof(body_frame)),
MockRead(true, reinterpret_cast<const char*>(fin_frame), sizeof(fin_frame)),
- MockRead(true, 0, 0), // EOF
+ MockRead(true, 0, 0) // EOF
};
- // We disable SSL for this test.
- FlipSession::SetSSLMode(false);
- SimpleGetHelperResult out = SimpleGetHelper(data_reads);
+ TransactionHelperResult out = TransactionHelper(request, data_reads, NULL);
EXPECT_EQ(OK, out.rv);
EXPECT_EQ("HTTP/1.1 200 OK", out.status_line);
EXPECT_EQ("hello!", out.response_data);
@@ -205,14 +304,17 @@ TEST_F(FlipNetworkTransactionTest, ResponseWithoutSynReply) {
MockRead(true, reinterpret_cast<const char*>(body_frame),
sizeof(body_frame)),
MockRead(true, reinterpret_cast<const char*>(fin_frame), sizeof(fin_frame)),
- MockRead(true, 0, 0), // EOF
+ MockRead(true, 0, 0) // EOF
};
- // We disable SSL for this test.
- FlipSession::SetSSLMode(false);
- SimpleGetHelperResult out = SimpleGetHelper(data_reads);
+ HttpRequestInfo request;
+ request.method = "GET";
+ request.url = GURL("http://www.google.com/");
+ request.load_flags = 0;
+ TransactionHelperResult out = TransactionHelper(request, data_reads, NULL);
EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv);
}
+
} // namespace net
diff --git a/net/flip/flip_session.cc b/net/flip/flip_session.cc
index b0f80524..7305103 100644
--- a/net/flip/flip_session.cc
+++ b/net/flip/flip_session.cc
@@ -270,10 +270,13 @@ int FlipSession::CreateStream(FlipDelegate* delegate) {
flip::FlipHeaderBlock headers;
CreateFlipHeadersFromHttpRequest(delegate->request(), &headers);
+ flip::FlipControlFlags flags = flip::CONTROL_FLAG_NONE;
+ if (!delegate->request()->upload_data)
+ flags = flip::CONTROL_FLAG_FIN;
+
// Create a SYN_STREAM packet and add to the output queue.
flip::FlipSynStreamControlFrame* syn_frame =
- flip_framer_.CreateSynStream(stream_id, priority,
- flip::CONTROL_FLAG_NONE, false, &headers);
+ flip_framer_.CreateSynStream(stream_id, priority, flags, false, &headers);
int length = sizeof(flip::FlipFrame) + syn_frame->length();
IOBufferWithSize* buffer =
new IOBufferWithSize(length);
diff --git a/net/flip/flip_session.h b/net/flip/flip_session.h
index 1845c27..81ec364 100644
--- a/net/flip/flip_session.h
+++ b/net/flip/flip_session.h
@@ -112,8 +112,7 @@ class FlipSession : public base::RefCounted<FlipSession>,
// status, such as "resolving host", "connecting", etc.
LoadState GetLoadState() const;
protected:
- FRIEND_TEST(FlipNetworkTransactionTest, Connect);
- FRIEND_TEST(FlipNetworkTransactionTest, ResponseWithoutSynReply);
+ friend class FlipNetworkTransactionTest;
friend class FlipSessionPool;
friend class HttpNetworkLayer; // Temporary for server.