Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <math.h> // ceil | 7 #include <math.h> // ceil |
| 8 #include <stdarg.h> | 8 #include <stdarg.h> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 275 "\r\n\r\n"; | 275 "\r\n\r\n"; |
| 276 } | 276 } |
| 277 | 277 |
| 278 // Either |write_failure| specifies a write failure or |read_failure| | 278 // Either |write_failure| specifies a write failure or |read_failure| |
| 279 // specifies a read failure when using a reused socket. In either case, the | 279 // specifies a read failure when using a reused socket. In either case, the |
| 280 // failure should cause the network transaction to resend the request, and the | 280 // failure should cause the network transaction to resend the request, and the |
| 281 // other argument should be NULL. | 281 // other argument should be NULL. |
| 282 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure, | 282 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure, |
| 283 const MockRead* read_failure); | 283 const MockRead* read_failure); |
| 284 | 284 |
| 285 // Test behaviour of retries when a request can be retried automatically. | |
| 286 void PartialDataRetryTest(int expected_status, | |
| 287 const char* expected_response_data, | |
| 288 MockRead read1[], | |
| 289 size_t read1_count, | |
| 290 MockRead read2[], | |
| 291 size_t read2_count, | |
| 292 MockRead read3[] = NULL, | |
| 293 size_t read3_count = 0, | |
| 294 MockRead read4[] = NULL, | |
| 295 size_t read4_count = 0, | |
| 296 MockRead read5[] = NULL, | |
| 297 size_t read5_count = 0); | |
|
mmenke
2014/07/23 20:17:43
While the Google style guide does technically allo
| |
| 298 | |
| 285 // Either |write_failure| specifies a write failure or |read_failure| | 299 // Either |write_failure| specifies a write failure or |read_failure| |
| 286 // specifies a read failure when using a reused socket. In either case, the | 300 // specifies a read failure when using a reused socket. In either case, the |
| 287 // failure should cause the network transaction to resend the request, and the | 301 // failure should cause the network transaction to resend the request, and the |
| 288 // other argument should be NULL. | 302 // other argument should be NULL. |
| 289 void PreconnectErrorResendRequestTest(const MockWrite* write_failure, | 303 void PreconnectErrorResendRequestTest(const MockWrite* write_failure, |
| 290 const MockRead* read_failure, | 304 const MockRead* read_failure, |
| 291 bool use_spdy); | 305 bool use_spdy); |
| 292 | 306 |
| 293 SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[], | 307 SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[], |
| 294 size_t data_count) { | 308 size_t data_count) { |
| (...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1330 EXPECT_TRUE(response->headers.get() != NULL); | 1344 EXPECT_TRUE(response->headers.get() != NULL); |
| 1331 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 1345 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 1332 | 1346 |
| 1333 std::string response_data; | 1347 std::string response_data; |
| 1334 rv = ReadTransaction(trans.get(), &response_data); | 1348 rv = ReadTransaction(trans.get(), &response_data); |
| 1335 EXPECT_EQ(OK, rv); | 1349 EXPECT_EQ(OK, rv); |
| 1336 EXPECT_EQ(kExpectedResponseData[i], response_data); | 1350 EXPECT_EQ(kExpectedResponseData[i], response_data); |
| 1337 } | 1351 } |
| 1338 } | 1352 } |
| 1339 | 1353 |
| 1354 void HttpNetworkTransactionTest::PartialDataRetryTest( | |
| 1355 int expected_status, | |
| 1356 const char* expected_response_data, | |
| 1357 MockRead read1[], | |
| 1358 size_t read1_count, | |
| 1359 MockRead read2[], | |
| 1360 size_t read2_count, | |
| 1361 MockRead read3[], | |
| 1362 size_t read3_count, | |
| 1363 MockRead read4[], | |
| 1364 size_t read4_count, | |
| 1365 MockRead read5[], | |
| 1366 size_t read5_count) { | |
| 1367 HttpRequestInfo request; | |
| 1368 request.method = "GET"; | |
| 1369 request.url = GURL("http://www.foo.com/"); | |
| 1370 request.load_flags = 0; | |
| 1371 | |
| 1372 CapturingNetLog net_log; | |
| 1373 session_deps_.net_log = &net_log; | |
|
mmenke
2014/07/23 20:17:42
nit: Don't need these two lines (A lot of tests s
jonnyr
2014/07/25 13:42:00
Done, but meant that I also had to remove TestLoad
| |
| 1374 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | |
| 1375 | |
| 1376 // Written data for successfully sending both requests. | |
| 1377 MockWrite data1_writes[] = { | |
| 1378 MockWrite("GET / HTTP/1.1\r\n" | |
| 1379 "Host: www.foo.com\r\n" | |
| 1380 "Connection: keep-alive\r\n\r\n") | |
| 1381 }; | |
| 1382 | |
| 1383 StaticSocketDataProvider data1(read1, read1_count, | |
| 1384 data1_writes, arraysize(data1_writes)); | |
| 1385 session_deps_.socket_factory->AddSocketDataProvider(&data1); | |
| 1386 | |
| 1387 StaticSocketDataProvider data2(read2, read2_count, NULL, 0); | |
|
mmenke
2014/07/23 20:17:43
Hrm...Only checking the write of the first request
jonnyr
2014/07/25 13:42:00
Yes, I need to see if I can verify that the retry
| |
| 1388 if (read2) | |
| 1389 session_deps_.socket_factory->AddSocketDataProvider(&data2); | |
| 1390 | |
| 1391 StaticSocketDataProvider data3(read3, read3_count, NULL, 0); | |
| 1392 if (read3) | |
| 1393 session_deps_.socket_factory->AddSocketDataProvider(&data3); | |
| 1394 | |
| 1395 StaticSocketDataProvider data4(read4, read4_count, NULL, 0); | |
| 1396 if (read4) | |
| 1397 session_deps_.socket_factory->AddSocketDataProvider(&data4); | |
| 1398 | |
| 1399 StaticSocketDataProvider data5(read5, read5_count, NULL, 0); | |
| 1400 if (read5) | |
| 1401 session_deps_.socket_factory->AddSocketDataProvider(&data5); | |
| 1402 | |
| 1403 uint32 first_socket_log_id = NetLog::Source::kInvalidId; | |
| 1404 for (int i = 0; i < 1; ++i) { | |
|
mmenke
2014/07/23 20:17:43
This loop isn't needed.
jonnyr
2014/07/25 13:41:59
Done.
| |
| 1405 TestCompletionCallback callback; | |
| 1406 | |
| 1407 scoped_ptr<HttpTransaction> trans( | |
| 1408 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); | |
| 1409 | |
| 1410 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); | |
| 1411 EXPECT_EQ(ERR_IO_PENDING, rv); | |
| 1412 | |
| 1413 rv = callback.WaitForResult(); | |
| 1414 EXPECT_EQ(OK, rv); | |
| 1415 | |
| 1416 LoadTimingInfo load_timing_info; | |
| 1417 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info)); | |
| 1418 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES); | |
| 1419 if (i == 0) { | |
| 1420 first_socket_log_id = load_timing_info.socket_log_id; | |
| 1421 } else { | |
| 1422 // The second request should be using a new socket. | |
| 1423 EXPECT_NE(first_socket_log_id, load_timing_info.socket_log_id); | |
| 1424 } | |
| 1425 | |
| 1426 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
| 1427 ASSERT_TRUE(response != NULL); | |
| 1428 | |
| 1429 EXPECT_TRUE(response->headers.get() != NULL); | |
| 1430 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | |
| 1431 | |
| 1432 std::string response_data; | |
| 1433 rv = ReadTransaction(trans.get(), &response_data); | |
| 1434 EXPECT_EQ(expected_status, rv); | |
| 1435 EXPECT_EQ(expected_response_data, response_data); | |
| 1436 } | |
| 1437 } | |
| 1438 | |
| 1340 void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest( | 1439 void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest( |
| 1341 const MockWrite* write_failure, | 1440 const MockWrite* write_failure, |
| 1342 const MockRead* read_failure, | 1441 const MockRead* read_failure, |
| 1343 bool use_spdy) { | 1442 bool use_spdy) { |
| 1344 HttpRequestInfo request; | 1443 HttpRequestInfo request; |
| 1345 request.method = "GET"; | 1444 request.method = "GET"; |
| 1346 request.url = GURL("https://www.foo.com/"); | 1445 request.url = GURL("https://www.foo.com/"); |
| 1347 request.load_flags = 0; | 1446 request.load_flags = 0; |
| 1348 | 1447 |
| 1349 CapturingNetLog net_log; | 1448 CapturingNetLog net_log; |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1531 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) { | 1630 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) { |
| 1532 MockRead read_failure(SYNCHRONOUS, OK); // EOF | 1631 MockRead read_failure(SYNCHRONOUS, OK); // EOF |
| 1533 PreconnectErrorResendRequestTest(NULL, &read_failure, true); | 1632 PreconnectErrorResendRequestTest(NULL, &read_failure, true); |
| 1534 } | 1633 } |
| 1535 | 1634 |
| 1536 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorAsyncEOF) { | 1635 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorAsyncEOF) { |
| 1537 MockRead read_failure(ASYNC, OK); // EOF | 1636 MockRead read_failure(ASYNC, OK); // EOF |
| 1538 PreconnectErrorResendRequestTest(NULL, &read_failure, true); | 1637 PreconnectErrorResendRequestTest(NULL, &read_failure, true); |
| 1539 } | 1638 } |
| 1540 | 1639 |
| 1640 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInHeader) { | |
| 1641 MockRead data_reads1[] = { | |
| 1642 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1643 MockRead("Content-Lengt"), | |
| 1644 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1645 }; | |
| 1646 | |
| 1647 MockRead data_reads2[] = { | |
| 1648 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1649 MockRead("Content-Length: 2\r\n\r\n"), | |
| 1650 MockRead("AA"), | |
| 1651 MockRead(ASYNC, OK), | |
| 1652 }; | |
| 1653 | |
| 1654 PartialDataRetryTest(OK, "AA", data_reads1, arraysize(data_reads1), | |
| 1655 data_reads2, arraysize(data_reads2)); | |
| 1656 } | |
| 1657 | |
| 1658 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodySingleRead) { | |
| 1659 MockRead data_reads1[] = { | |
| 1660 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1661 MockRead("Cache-Control: max-age=100\r\n"), | |
| 1662 MockRead("Content-Length: 2\r\n\r\n"), | |
| 1663 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1664 }; | |
| 1665 | |
| 1666 MockRead data_reads2[] = { | |
| 1667 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1668 MockRead("Cache-Control: max-age=100\r\n"), | |
|
mmenke
2014/07/23 20:17:43
I don't believe this test should have the max age
jonnyr
2014/07/25 13:41:59
This test checks full header without any body data
| |
| 1669 MockRead("Content-Length: 2\r\n\r\nAB"), | |
| 1670 MockRead(ASYNC, OK), | |
| 1671 }; | |
| 1672 | |
| 1673 PartialDataRetryTest(OK, "AB", data_reads1, arraysize(data_reads1), | |
| 1674 data_reads2, arraysize(data_reads2)); | |
| 1675 } | |
| 1676 | |
| 1677 TEST_P(HttpNetworkTransactionTest, PartialDataRetryMaxAgeSuccess) { | |
| 1678 MockRead data_reads1[] = { | |
| 1679 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1680 MockRead("Cache-Control: max-age=100\r\n"), | |
| 1681 MockRead("Content-Length: 2\r\n\r\nA"), | |
| 1682 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1683 }; | |
| 1684 | |
| 1685 MockRead data_reads2[] = { | |
| 1686 MockRead("HTTP/1.1 200 OK\r\n"), | |
| 1687 MockRead("Cache-Control: max-age=100\r\n"), | |
| 1688 MockRead("Content-Length: 2\r\n\r\nAC"), | |
| 1689 MockRead(ASYNC, OK), | |
| 1690 }; | |
| 1691 | |
| 1692 PartialDataRetryTest(OK, "AC", data_reads1, arraysize(data_reads1), | |
| 1693 data_reads2, arraysize(data_reads2)); | |
| 1694 } | |
| 1695 | |
| 1696 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyPragmaNoCache) { | |
| 1697 MockRead data_reads1[] = { | |
| 1698 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1699 "Pragma: no-cache\r\n"\ | |
|
mmenke
2014/07/23 20:17:43
Backslashes aren't needed at the end of these line
jonnyr
2014/07/25 13:42:00
Done.
| |
| 1700 "Content-Length: 2\r\n\r\n"), | |
| 1701 MockRead("A"), | |
| 1702 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1703 }; | |
| 1704 | |
| 1705 MockRead data_reads2[] = { | |
| 1706 MockRead("HTTP/1.1 200 OK\r\nPragma: no-cache\r\n"), | |
|
mmenke
2014/07/23 20:17:43
Pragma: no-cache should be on its own line (Or did
jonnyr
2014/07/25 13:42:00
Done.
| |
| 1707 MockRead("Content-Length: 2\r\n\r\n"), | |
| 1708 MockRead("AD"), | |
| 1709 MockRead(ASYNC, OK), | |
| 1710 }; | |
| 1711 | |
| 1712 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1, | |
| 1713 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 1714 } | |
| 1715 | |
| 1716 TEST_P(HttpNetworkTransactionTest, PartialDataRetryCacheControlNoCache) { | |
|
mmenke
2014/07/23 20:17:43
How's this different from the previous test?
jonnyr
2014/07/25 13:42:00
It is not different anymore. Earlier it went throu
| |
| 1717 MockRead data_reads1[] = { | |
| 1718 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1719 "Cache-Control: no-cache\r\n"), | |
| 1720 MockRead("Content-Length: 2\r\n\r\nO"), | |
| 1721 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1722 }; | |
| 1723 | |
| 1724 MockRead data_reads2[] = { | |
| 1725 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1726 "Cache-Control: no-cache\r\n"), | |
| 1727 MockRead("Content-Length: 2\r\n\r\nOK"), | |
| 1728 MockRead(ASYNC, OK), | |
| 1729 }; | |
| 1730 | |
| 1731 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1, | |
| 1732 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 1733 } | |
| 1734 | |
| 1735 TEST_P(HttpNetworkTransactionTest, PartialDataRetryMaxAgeFail) { | |
| 1736 MockRead data_reads1[] = { | |
| 1737 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1738 "Cache-Control: max-age=-1\r\n"), | |
| 1739 MockRead("Content-Length: 2\r\n\r\n"), | |
| 1740 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1741 }; | |
| 1742 | |
| 1743 MockRead data_reads2[] = { | |
|
mmenke
2014/07/23 20:17:43
Again, shouldn't be a second read when we don't us
jonnyr
2014/07/25 13:42:00
Done.
| |
| 1744 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1745 "Cache-Control: max-age=-1\r\n"), | |
| 1746 MockRead("Content-Length: 2\r\n\r\nAE"), | |
| 1747 MockRead(ASYNC, OK), | |
| 1748 }; | |
| 1749 | |
| 1750 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1, | |
| 1751 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 1752 } | |
| 1753 | |
| 1754 TEST_P(HttpNetworkTransactionTest, PartialDataRetryAlmostExpired) { | |
| 1755 MockRead data_reads1[] = { | |
| 1756 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1757 "Date: Wed,14 Dec 2011 15:50:00 GMT\r\n"), | |
| 1758 MockRead("Expires: Wed,14 Dec 2011 15:50:59 GMT\r\n"), | |
| 1759 MockRead("Content-Length: 2\r\n\r\nA"), | |
| 1760 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1761 }; | |
| 1762 | |
| 1763 MockRead data_reads2[] = { | |
| 1764 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1765 "Date: Wed,14 Dec 2011 15:50:00 GMT\r\n"), | |
| 1766 MockRead("Expires: Wed,14 Dec 2011 15:50:59 GMT\r\n"), | |
| 1767 MockRead("Content-Length: 2\r\n\r\nAF"), | |
| 1768 MockRead(ASYNC, OK), | |
| 1769 }; | |
| 1770 | |
| 1771 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1, | |
| 1772 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 1773 } | |
| 1774 | |
| 1775 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyMultipleReads) { | |
| 1776 MockRead data_reads1[] = { | |
| 1777 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1778 "Content-Length: 2\r\n"), | |
| 1779 MockRead("Cache-Control: max-age=100\r\n\r\nA"), | |
| 1780 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1781 }; | |
| 1782 | |
| 1783 MockRead data_reads2[] = { | |
| 1784 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1785 "Content-Length: 2\r\n"), | |
| 1786 MockRead("Cache-Control: max-age=100\r\n\r\nA"), | |
| 1787 MockRead("G"), | |
| 1788 MockRead(ASYNC, OK), | |
| 1789 }; | |
| 1790 | |
| 1791 PartialDataRetryTest(OK, "AG", data_reads1, arraysize(data_reads1), | |
| 1792 data_reads2, arraysize(data_reads2)); | |
| 1793 } | |
| 1794 | |
| 1795 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInLargeBody) { | |
| 1796 MockRead data_reads1[] = { | |
| 1797 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1798 "Cache-Control: max-age=100\r\n"\ | |
| 1799 "Content-Length: 400\r\n\r\n"\ | |
| 1800 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1801 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1802 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1803 "012345678901234567890123456789012345678901234567890123456789"\ | |
|
mmenke
2014/07/23 20:17:43
All these backslashes aren't needed.
jonnyr
2014/07/25 13:42:00
Done.
| |
| 1804 "0123456789012345678901234567890123456789012345678901234567890"), | |
|
mmenke
2014/07/23 20:17:43
Suggest splitting this up into multiple reads, in
jonnyr
2014/07/25 13:41:59
Done.
| |
| 1805 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1806 }; | |
| 1807 | |
| 1808 MockRead data_reads2[] = { | |
| 1809 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1810 "Cache-Control: max-age=100\r\n"\ | |
| 1811 "Content-Length: 400\r\n\r\n"\ | |
| 1812 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1813 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1814 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1815 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1816 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1817 "012345678901234567890123456789012345678901234567890123456789"\ | |
| 1818 "0123456789012345678901234567890123456789"), | |
| 1819 MockRead(ASYNC, OK), | |
| 1820 }; | |
| 1821 | |
| 1822 PartialDataRetryTest(OK, | |
| 1823 "0123456789012345678901234567890123456789012345678901234567890123456789"\ | |
| 1824 "0123456789012345678901234567890123456789012345678901234567890123456789"\ | |
| 1825 "0123456789012345678901234567890123456789012345678901234567890123456789"\ | |
| 1826 "0123456789012345678901234567890123456789012345678901234567890123456789"\ | |
| 1827 "0123456789012345678901234567890123456789012345678901234567890123456789"\ | |
| 1828 "01234567890123456789012345678901234567890123456789", | |
|
mmenke
2014/07/23 20:17:42
For sanity, should use the same number of characte
jonnyr
2014/07/25 13:42:00
Done.
| |
| 1829 data_reads1, arraysize(data_reads1), | |
| 1830 data_reads2, arraysize(data_reads2)); | |
| 1831 } | |
| 1832 | |
| 1833 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyRangeMultipleReads) { | |
| 1834 MockRead data_reads1[] = { | |
| 1835 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1836 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\ | |
| 1837 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\ | |
| 1838 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\ | |
| 1839 "Last-Modified: Wed, 14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 1840 "Accept-Ranges: bytes\r\n"\ | |
| 1841 "Content-Length: 3\r\n\r\nA"), | |
| 1842 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1843 }; | |
| 1844 | |
| 1845 MockRead data_reads2[] = { | |
| 1846 MockRead("HTTP/1.1 206 Partial Content\r\n"\ | |
| 1847 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\ | |
| 1848 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\ | |
| 1849 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\ | |
| 1850 "Last-Modified: Wed, 14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 1851 "Content-Length: 2\r\n"\ | |
| 1852 "Content-Range: bytes 1-2/3\r\n\r\n"), | |
|
mmenke
2014/07/23 20:17:43
Should definitely check the second set of request
jonnyr
2014/07/25 13:42:00
Agreed.
| |
| 1853 MockRead("HA"), | |
| 1854 MockRead(ASYNC, OK), | |
| 1855 }; | |
| 1856 | |
| 1857 PartialDataRetryTest(OK, "AHA", data_reads1, arraysize(data_reads1), | |
| 1858 data_reads2, arraysize(data_reads2)); | |
| 1859 } | |
| 1860 | |
| 1861 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyRangeSingleRead) { | |
| 1862 MockRead data_reads1[] = { | |
| 1863 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1864 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\ | |
| 1865 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\ | |
| 1866 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\ | |
| 1867 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 1868 "Accept-Ranges: bytes\r\n"\ | |
| 1869 "Content-Length: 3\r\n\r\nA"), | |
| 1870 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1871 }; | |
| 1872 | |
| 1873 MockRead data_reads2[] = { | |
| 1874 MockRead("HTTP/1.1 206 Partial Content\r\n"\ | |
| 1875 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\ | |
| 1876 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\ | |
| 1877 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\ | |
| 1878 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 1879 "Accept-Ranges: bytes\r\n"\ | |
| 1880 "Content-Length: 2\r\n"\ | |
| 1881 "Content-Range: bytes 1-2/3\r\n\r\nIA"), | |
| 1882 MockRead(ASYNC, OK), | |
| 1883 }; | |
| 1884 | |
| 1885 PartialDataRetryTest(OK, "AIA", data_reads1, arraysize(data_reads1), | |
| 1886 data_reads2, arraysize(data_reads2)); | |
| 1887 } | |
| 1888 | |
| 1889 TEST_P(HttpNetworkTransactionTest, PartialDataRetryChunked) { | |
| 1890 MockRead data_reads1[] = { | |
| 1891 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1892 "Transfer-Encoding: chunked\r\n"\ | |
| 1893 "Cache-Control: max-age=100\r\n\r\n"), | |
| 1894 MockRead("2\r\n"), | |
| 1895 MockRead("A"), | |
| 1896 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1897 }; | |
| 1898 | |
| 1899 MockRead data_reads2[] = { | |
| 1900 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1901 "Transfer-Encoding: chunked\r\n"\ | |
| 1902 "Cache-Control: max-age=100\r\n\r\n"), | |
| 1903 MockRead("2\r\n"), | |
| 1904 MockRead("AJ\r\n"), | |
| 1905 MockRead("2\r\n"), | |
| 1906 MockRead("AJ\r\n"), | |
| 1907 MockRead("0\r\n\r\n"), | |
| 1908 MockRead(ASYNC, OK), | |
| 1909 }; | |
| 1910 | |
| 1911 PartialDataRetryTest(OK, "AJAJ", data_reads1, arraysize(data_reads1), | |
| 1912 data_reads2, arraysize(data_reads2)); | |
| 1913 } | |
| 1914 | |
| 1915 TEST_P(HttpNetworkTransactionTest, PartialDataRetryChangedContentNormal) { | |
| 1916 MockRead data_reads1[] = { | |
| 1917 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1918 "Cache-Control: max-age=100\r\n"\ | |
| 1919 "Content-Length: 2\r\n\r\nA"), | |
| 1920 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1921 }; | |
| 1922 | |
| 1923 MockRead data_reads2[] = { | |
| 1924 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1925 "Cache-Control: max-age=100\r\n"\ | |
| 1926 "Content-Length: 2\r\n\r\nOC"), | |
| 1927 MockRead(ASYNC, OK), | |
| 1928 }; | |
| 1929 | |
| 1930 PartialDataRetryTest(ERR_RETRY_HASH_MISMATCH, "", data_reads1, | |
| 1931 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 1932 } | |
| 1933 | |
| 1934 TEST_P(HttpNetworkTransactionTest, PartialDataRetryChangedContentChunked) { | |
| 1935 MockRead data_reads1[] = { | |
| 1936 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1937 "Transfer-Encoding: chunked\r\n"\ | |
| 1938 "Cache-Control: max-age=100\r\n\r\n"), | |
| 1939 MockRead("1\r\n"), | |
| 1940 MockRead("A\r\n"), | |
| 1941 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1942 }; | |
| 1943 | |
| 1944 MockRead data_reads2[] = { | |
| 1945 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1946 "Transfer-Encoding: chunked\r\n"\ | |
| 1947 "Cache-Control: max-age=100\r\n\r\n"), | |
| 1948 MockRead("1\r\n"), | |
| 1949 MockRead("B\r\n"), | |
| 1950 MockRead("1\r\nJ\r\n"), | |
| 1951 MockRead("0\r\n\r\n"), | |
| 1952 MockRead(ASYNC, OK), | |
| 1953 }; | |
| 1954 | |
| 1955 PartialDataRetryTest(ERR_RETRY_HASH_MISMATCH, "", data_reads1, | |
| 1956 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 1957 } | |
| 1958 | |
| 1959 TEST_P(HttpNetworkTransactionTest, PartialDataRetryTwoTimes) { | |
| 1960 MockRead data_reads1[] = { | |
| 1961 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1962 "Cache-Control: max-age=100\r\n"\ | |
| 1963 "Content-Length: 3\r\n\r\nA"), | |
| 1964 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1965 }; | |
| 1966 | |
| 1967 MockRead data_reads2[] = { | |
| 1968 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1969 "Cache-Control: max-age=100\r\n"\ | |
| 1970 "Content-Length: 3\r\n\r\nAB"), | |
| 1971 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1972 }; | |
| 1973 | |
| 1974 MockRead data_reads3[] = { | |
| 1975 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1976 "Cache-Control: max-age=100\r\n"\ | |
| 1977 "Content-Length: 3\r\n\r\nABC"), | |
| 1978 MockRead(ASYNC, OK), | |
| 1979 }; | |
| 1980 | |
| 1981 PartialDataRetryTest(OK, "ABC", data_reads1, arraysize(data_reads1), | |
| 1982 data_reads2, arraysize(data_reads2), data_reads3, arraysize(data_reads3)); | |
| 1983 } | |
| 1984 | |
| 1985 TEST_P(HttpNetworkTransactionTest, PartialDataRetryFourTimes) { | |
| 1986 MockRead data_reads1[] = { | |
| 1987 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1988 "Cache-Control: max-age=100\r\n"\ | |
| 1989 "Content-Length: 5\r\n\r\nA"), | |
| 1990 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1991 }; | |
| 1992 | |
| 1993 MockRead data_reads2[] = { | |
| 1994 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 1995 "Cache-Control: max-age=100\r\n"\ | |
| 1996 "Content-Length: 5\r\n\r\nAB"), | |
| 1997 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 1998 }; | |
| 1999 | |
| 2000 MockRead data_reads3[] = { | |
| 2001 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2002 "Cache-Control: max-age=100\r\n"\ | |
| 2003 "Content-Length: 5\r\n\r\nABC"), | |
| 2004 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2005 }; | |
| 2006 | |
| 2007 MockRead data_reads4[] = { | |
| 2008 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2009 "Cache-Control: max-age=100\r\n"\ | |
| 2010 "Content-Length: 5\r\n\r\nABCD"), | |
| 2011 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2012 }; | |
| 2013 | |
| 2014 MockRead data_reads5[] = { | |
| 2015 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2016 "Cache-Control: max-age=100\r\n"\ | |
| 2017 "Content-Length: 5\r\n\r\nABCDE"), | |
| 2018 MockRead(ASYNC, OK), | |
| 2019 }; | |
| 2020 | |
| 2021 PartialDataRetryTest(OK, "ABCDE", data_reads1, arraysize(data_reads1), | |
| 2022 data_reads2, arraysize(data_reads2), data_reads3, arraysize(data_reads3), | |
| 2023 data_reads4, arraysize(data_reads4), data_reads5, arraysize(data_reads5)); | |
| 2024 } | |
| 2025 | |
| 2026 TEST_P(HttpNetworkTransactionTest, PartialDataRetrySmallerContent) { | |
| 2027 MockRead data_reads1[] = { | |
| 2028 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2029 "Cache-Control: max-age=100\r\n"\ | |
| 2030 "Content-Length: 5\r\n\r\nAB"), | |
| 2031 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2032 }; | |
| 2033 | |
| 2034 MockRead data_reads2[] = { | |
| 2035 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2036 "Cache-Control: max-age=100\r\n"\ | |
| 2037 "Content-Len"), | |
| 2038 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2039 }; | |
| 2040 | |
| 2041 MockRead data_reads3[] = { | |
| 2042 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2043 "Cache-Control: max-age=100\r\n"\ | |
| 2044 "Content-Length: 5\r\n\r\nABCDE"), | |
| 2045 MockRead(ASYNC, OK), | |
| 2046 }; | |
| 2047 | |
| 2048 PartialDataRetryTest(OK, "ABCDE", data_reads1, arraysize(data_reads1), | |
| 2049 data_reads2, arraysize(data_reads2), data_reads3, arraysize(data_reads3)); | |
| 2050 } | |
| 2051 | |
| 2052 TEST_P(HttpNetworkTransactionTest, PartialDataRetryContentLengthChange) { | |
| 2053 MockRead data_reads1[] = { | |
| 2054 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2055 "Cache-Control: max-age=100\r\n"\ | |
| 2056 "Content-Length: 2\r\n\r\nA"), | |
| 2057 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2058 }; | |
| 2059 | |
| 2060 MockRead data_reads2[] = { | |
| 2061 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2062 "Cache-Control: max-age=100\r\n"\ | |
| 2063 "Content-Length: 3\r\n\r\nABC"), | |
| 2064 MockRead(ASYNC, OK), | |
| 2065 }; | |
| 2066 PartialDataRetryTest(ERR_RETRY_CONTENT_UPDATED, "", data_reads1, | |
| 2067 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 2068 } | |
| 2069 | |
| 2070 TEST_P(HttpNetworkTransactionTest, PartialDataRetryEtagOK) { | |
| 2071 MockRead data_reads1[] = { | |
| 2072 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2073 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\ | |
| 2074 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 2075 "Content-Length: 2\r\n\r\nA"), | |
| 2076 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2077 }; | |
| 2078 | |
| 2079 MockRead data_reads2[] = { | |
| 2080 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2081 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\ | |
| 2082 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 2083 "Content-Length: 2\r\n\r\nA1"), | |
| 2084 MockRead(ASYNC, OK), | |
| 2085 }; | |
| 2086 | |
| 2087 PartialDataRetryTest(OK, "A1", data_reads1, arraysize(data_reads1), | |
| 2088 data_reads2, arraysize(data_reads2)); | |
| 2089 } | |
| 2090 | |
| 2091 TEST_P(HttpNetworkTransactionTest, PartialDataRetryLastModifiedChanged) { | |
| 2092 MockRead data_reads1[] = { | |
| 2093 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2094 "Last-Modified: Wed,14 Dec 2011 15:50:50 GMT\r\n"\ | |
| 2095 "Content-Length: 2\r\n\r\nA"), | |
| 2096 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2097 }; | |
| 2098 | |
| 2099 MockRead data_reads2[] = { | |
| 2100 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2101 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 2102 "Content-Length: 2\r\n\r\nA1"), | |
| 2103 MockRead(ASYNC, OK), | |
| 2104 }; | |
| 2105 | |
| 2106 PartialDataRetryTest(ERR_RETRY_CONTENT_UPDATED, "", data_reads1, | |
| 2107 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 2108 } | |
| 2109 | |
| 2110 TEST_P(HttpNetworkTransactionTest, PartialDataRetryEtagChange) { | |
| 2111 MockRead data_reads1[] = { | |
| 2112 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2113 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\ | |
| 2114 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 2115 "Content-Length: 2\r\n\r\nA"), | |
| 2116 MockRead(ASYNC, ERR_CONNECTION_RESET), | |
| 2117 }; | |
| 2118 | |
| 2119 MockRead data_reads2[] = { | |
| 2120 MockRead("HTTP/1.1 200 OK\r\n"\ | |
| 2121 "ETag: A023EF02BD589BC472A2D6774EAE3C59\r\n"\ | |
| 2122 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\ | |
| 2123 "Content-Length: 2\r\n\r\nA1"), | |
| 2124 MockRead(ASYNC, OK), | |
| 2125 }; | |
| 2126 | |
| 2127 PartialDataRetryTest(ERR_RETRY_CONTENT_UPDATED, "", data_reads1, | |
| 2128 arraysize(data_reads1), data_reads2, arraysize(data_reads2)); | |
| 2129 } | |
| 2130 | |
| 1541 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { | 2131 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { |
| 1542 HttpRequestInfo request; | 2132 HttpRequestInfo request; |
| 1543 request.method = "GET"; | 2133 request.method = "GET"; |
| 1544 request.url = GURL("http://www.google.com/"); | 2134 request.url = GURL("http://www.google.com/"); |
| 1545 request.load_flags = 0; | 2135 request.load_flags = 0; |
| 1546 | 2136 |
| 1547 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); | 2137 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
| 1548 scoped_ptr<HttpTransaction> trans( | 2138 scoped_ptr<HttpTransaction> trans( |
| 1549 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); | 2139 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); |
| 1550 | 2140 |
| (...skipping 10704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12255 virtual bool IsConnectionReusable() const OVERRIDE { | 12845 virtual bool IsConnectionReusable() const OVERRIDE { |
| 12256 ADD_FAILURE(); | 12846 ADD_FAILURE(); |
| 12257 return false; | 12847 return false; |
| 12258 } | 12848 } |
| 12259 | 12849 |
| 12260 virtual int64 GetTotalReceivedBytes() const OVERRIDE { | 12850 virtual int64 GetTotalReceivedBytes() const OVERRIDE { |
| 12261 ADD_FAILURE(); | 12851 ADD_FAILURE(); |
| 12262 return 0; | 12852 return 0; |
| 12263 } | 12853 } |
| 12264 | 12854 |
| 12855 virtual int64 GetReceivedBodyLength() const OVERRIDE { | |
| 12856 ADD_FAILURE(); | |
| 12857 return 0; | |
| 12858 } | |
| 12859 | |
| 12265 virtual bool GetLoadTimingInfo( | 12860 virtual bool GetLoadTimingInfo( |
| 12266 LoadTimingInfo* load_timing_info) const OVERRIDE { | 12861 LoadTimingInfo* load_timing_info) const OVERRIDE { |
| 12267 ADD_FAILURE(); | 12862 ADD_FAILURE(); |
| 12268 return false; | 12863 return false; |
| 12269 } | 12864 } |
| 12270 | 12865 |
| 12271 virtual void GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { | 12866 virtual void GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { |
| 12272 ADD_FAILURE(); | 12867 ADD_FAILURE(); |
| 12273 } | 12868 } |
| 12274 | 12869 |
| 12275 virtual void GetSSLCertRequestInfo( | 12870 virtual void GetSSLCertRequestInfo( |
| 12276 SSLCertRequestInfo* cert_request_info) OVERRIDE { | 12871 SSLCertRequestInfo* cert_request_info) OVERRIDE { |
| 12277 ADD_FAILURE(); | 12872 ADD_FAILURE(); |
| 12278 } | 12873 } |
| 12279 | 12874 |
| 12280 virtual bool IsSpdyHttpStream() const OVERRIDE { | 12875 virtual bool IsSpdyHttpStream() const OVERRIDE { |
| 12281 ADD_FAILURE(); | 12876 ADD_FAILURE(); |
| 12282 return false; | 12877 return false; |
| 12283 } | 12878 } |
| 12284 | 12879 |
| 12285 virtual void Drain(HttpNetworkSession* session) OVERRIDE { | 12880 virtual void Drain(HttpNetworkSession* session) OVERRIDE { |
| 12286 ADD_FAILURE(); | 12881 ADD_FAILURE(); |
| 12287 } | 12882 } |
| 12288 | 12883 |
| 12289 virtual void SetPriority(RequestPriority priority) OVERRIDE { | 12884 virtual void SetPriority(RequestPriority priority) OVERRIDE { |
| 12290 priority_ = priority; | 12885 priority_ = priority; |
| 12291 } | 12886 } |
| 12292 | 12887 |
| 12888 virtual void SetRestartInfo(int64 read_offset, const void* hash, | |
| 12889 size_t hash_length) { | |
| 12890 ADD_FAILURE(); | |
| 12891 } | |
| 12892 | |
| 12893 virtual void GetHash(void* output, size_t len) { | |
| 12894 ADD_FAILURE(); | |
| 12895 } | |
| 12896 | |
| 12293 private: | 12897 private: |
| 12294 RequestPriority priority_; | 12898 RequestPriority priority_; |
| 12295 | 12899 |
| 12296 DISALLOW_COPY_AND_ASSIGN(FakeStream); | 12900 DISALLOW_COPY_AND_ASSIGN(FakeStream); |
| 12297 }; | 12901 }; |
| 12298 | 12902 |
| 12299 // Fake HttpStreamRequest that simply records calls to SetPriority() | 12903 // Fake HttpStreamRequest that simply records calls to SetPriority() |
| 12300 // and vends FakeStreams with its current priority. | 12904 // and vends FakeStreams with its current priority. |
| 12301 class FakeStreamRequest : public HttpStreamRequest, | 12905 class FakeStreamRequest : public HttpStreamRequest, |
| 12302 public base::SupportsWeakPtr<FakeStreamRequest> { | 12906 public base::SupportsWeakPtr<FakeStreamRequest> { |
| (...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13203 EXPECT_EQ(ERR_IO_PENDING, rv); | 13807 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 13204 | 13808 |
| 13205 rv = callback.WaitForResult(); | 13809 rv = callback.WaitForResult(); |
| 13206 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 13810 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 13207 | 13811 |
| 13208 const HttpResponseInfo* response = trans->GetResponseInfo(); | 13812 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 13209 EXPECT_TRUE(response == NULL); | 13813 EXPECT_TRUE(response == NULL); |
| 13210 } | 13814 } |
| 13211 | 13815 |
| 13212 } // namespace net | 13816 } // namespace net |
| OLD | NEW |