Index: android_webview/browser/net/android_stream_reader_url_request_job_unittest.cc |
diff --git a/android_webview/browser/net/android_stream_reader_url_request_job_unittest.cc b/android_webview/browser/net/android_stream_reader_url_request_job_unittest.cc |
index f09b5c534327eca620272731a82e4543d4b272e7..51946230ef142b6ceb0a6877860fb5d98a5755cd 100644 |
--- a/android_webview/browser/net/android_stream_reader_url_request_job_unittest.cc |
+++ b/android_webview/browser/net/android_stream_reader_url_request_job_unittest.cc |
@@ -12,6 +12,7 @@ |
#include "base/strings/stringprintf.h" |
#include "net/base/request_priority.h" |
#include "net/http/http_byte_range.h" |
+#include "net/http/http_response_headers.h" |
#include "net/url_request/url_request_job_factory_impl.h" |
#include "net/url_request/url_request_test_util.h" |
@@ -93,6 +94,11 @@ class StreamReaderDelegate : |
std::string* charset) OVERRIDE { |
return false; |
} |
+ |
+ virtual void UpdateHeaders(JNIEnv* env, |
+ net::HttpResponseHeaders* headers) OVERRIDE { |
+ // no-op |
+ } |
}; |
class NullStreamReaderDelegate : public StreamReaderDelegate { |
@@ -106,6 +112,33 @@ class NullStreamReaderDelegate : public StreamReaderDelegate { |
} |
}; |
+class HeaderAlteringStreamReaderDelegate : public NullStreamReaderDelegate { |
+ public: |
+ HeaderAlteringStreamReaderDelegate() {} |
+ |
+ virtual void UpdateHeaders(JNIEnv* env, |
+ net::HttpResponseHeaders* headers) OVERRIDE { |
+ headers->ReplaceStatusLine(kStatusLine); |
+ std::string headerLine(kCustomHeaderName); |
+ headerLine.append(": "); |
+ headerLine.append(kCustomHeaderValue); |
+ headers->AddHeader(headerLine); |
+ } |
+ |
+ static const int kResponseCode; |
+ static const char* kStatusLine; |
+ static const char* kCustomHeaderName; |
+ static const char* kCustomHeaderValue; |
+}; |
+ |
+const int HeaderAlteringStreamReaderDelegate::kResponseCode = 401; |
benm (inactive)
2014/05/15 16:17:40
are there any headers that we shouldn't allow the
mkosiba (inactive)
2014/05/15 17:03:21
That's a good question. I'm not sure there is a lo
|
+const char* HeaderAlteringStreamReaderDelegate::kStatusLine = |
+ "HTTP/1.1 401 Gone"; |
+const char* HeaderAlteringStreamReaderDelegate::kCustomHeaderName = |
+ "X-Test-Header"; |
+const char* HeaderAlteringStreamReaderDelegate::kCustomHeaderValue = |
+ "TestHeaderValue"; |
+ |
class MockInputStreamReader : public InputStreamReader { |
public: |
MockInputStreamReader() : InputStreamReader(new NotImplInputStream()) {} |
@@ -245,6 +278,35 @@ TEST_F(AndroidStreamReaderURLRequestJobTest, ReadWithNullStream) { |
EXPECT_EQ(404, req_->GetResponseCode()); |
} |
+TEST_F(AndroidStreamReaderURLRequestJobTest, ModifyHeadersAndStatus) { |
+ SetUpTestJob(scoped_ptr<InputStreamReader>(), |
+ make_scoped_ptr(new HeaderAlteringStreamReaderDelegate()) |
+ .PassAs<AndroidStreamReaderURLRequestJob::Delegate>()); |
+ req_->Start(); |
+ |
+ // The TestDelegate will quit the message loop on request completion. |
+ base::MessageLoop::current()->Run(); |
+ |
+ // The request_failed() method is named confusingly but all it checks is |
+ // whether the request got as far as calling NotifyHeadersComplete. |
+ EXPECT_FALSE(url_request_delegate_.request_failed()); |
+ EXPECT_EQ(1, network_delegate_.completed_requests()); |
+ // A null input stream shouldn't result in an error. See crbug.com/180950. |
+ EXPECT_EQ(0, network_delegate_.error_count()); |
+ EXPECT_EQ(HeaderAlteringStreamReaderDelegate::kResponseCode, |
+ req_->GetResponseCode()); |
+ EXPECT_EQ(HeaderAlteringStreamReaderDelegate::kStatusLine, |
+ req_->response_headers()->GetStatusLine()); |
+ EXPECT_TRUE(req_->response_headers()->HasHeader( |
+ HeaderAlteringStreamReaderDelegate::kCustomHeaderName)); |
+ std::string header_value; |
+ EXPECT_TRUE(req_->response_headers()->EnumerateHeader( |
+ NULL, HeaderAlteringStreamReaderDelegate::kCustomHeaderName, |
+ &header_value)); |
+ EXPECT_EQ(HeaderAlteringStreamReaderDelegate::kCustomHeaderValue, |
+ header_value); |
+} |
+ |
TEST_F(AndroidStreamReaderURLRequestJobTest, ReadPartOfStream) { |
const int bytes_available = 128; |
const int offset = 32; |