Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(798)

Unified Diff: net/http/http_network_transaction_unittest.cc

Issue 25217002: net: Reset UploadDataStream on HttpNetworkTransaction destruction (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix nits Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/http_network_transaction.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/http/http_network_transaction_unittest.cc
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 617a6b50d7c22240a3073b48c7eb5c1eafa189dd..c60d6ecaea7e6b0360d2aeb48175a2aebe6b8455 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -7771,6 +7771,62 @@ TEST_P(HttpNetworkTransactionTest, UnreadableUploadFileAfterAuthRestart) {
base::DeleteFile(temp_file, false);
}
+TEST_P(HttpNetworkTransactionTest, CancelDuringInitRequestBody) {
+ class FakeUploadElementReader : public UploadElementReader {
+ public:
+ FakeUploadElementReader() {}
+ virtual ~FakeUploadElementReader() {}
+
+ const CompletionCallback& callback() const { return callback_; }
+
+ // UploadElementReader overrides:
+ virtual int Init(const CompletionCallback& callback) OVERRIDE {
+ callback_ = callback;
+ return ERR_IO_PENDING;
+ }
+ virtual uint64 GetContentLength() const OVERRIDE { return 0; }
+ virtual uint64 BytesRemaining() const OVERRIDE { return 0; }
+ virtual int Read(IOBuffer* buf,
+ int buf_length,
+ const CompletionCallback& callback) OVERRIDE {
+ return ERR_FAILED;
+ }
+
+ private:
+ CompletionCallback callback_;
+ };
+
+ FakeUploadElementReader* fake_reader = new FakeUploadElementReader;
+ ScopedVector<UploadElementReader> element_readers;
+ element_readers.push_back(fake_reader);
+ UploadDataStream upload_data_stream(element_readers.Pass(), 0);
+
+ HttpRequestInfo request;
+ request.method = "POST";
+ request.url = GURL("http://www.google.com/upload");
+ request.upload_data_stream = &upload_data_stream;
+ request.load_flags = 0;
+
+ scoped_ptr<HttpTransaction> trans(
+ new HttpNetworkTransaction(DEFAULT_PRIORITY,
+ CreateSession(&session_deps_)));
+
+ StaticSocketDataProvider data;
+ session_deps_.socket_factory->AddSocketDataProvider(&data);
+
+ TestCompletionCallback callback;
+ int rv = trans->Start(&request, callback.callback(), BoundNetLog());
+ EXPECT_EQ(ERR_IO_PENDING, rv);
+ base::MessageLoop::current()->RunUntilIdle();
+
+ // Transaction is pending on request body initialization.
+ ASSERT_FALSE(fake_reader->callback().is_null());
+
+ // Return Init()'s result after the transaction gets destroyed.
+ trans.reset();
+ fake_reader->callback().Run(OK); // Should not crash.
+}
+
// Tests that changes to Auth realms are treated like auth rejections.
TEST_P(HttpNetworkTransactionTest, ChangeAuthRealms) {
« no previous file with comments | « net/http/http_network_transaction.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698