| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/weak_ptr.h" | 10 #include "base/memory/weak_ptr.h" |
| 11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
| 17 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
| 18 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" |
| 19 #include "net/dns/mock_host_resolver.h" | 19 #include "net/dns/mock_host_resolver.h" |
| 20 #include "net/log/net_log.h" | 20 #include "net/log/net_log.h" |
| 21 #include "net/log/net_log_event_type.h" |
| 21 #include "net/log/test_net_log.h" | 22 #include "net/log/test_net_log.h" |
| 22 #include "net/log/test_net_log_entry.h" | 23 #include "net/log/test_net_log_entry.h" |
| 23 #include "net/log/test_net_log_util.h" | 24 #include "net/log/test_net_log_util.h" |
| 24 #include "net/proxy/dhcp_proxy_script_fetcher.h" | 25 #include "net/proxy/dhcp_proxy_script_fetcher.h" |
| 25 #include "net/proxy/mock_proxy_script_fetcher.h" | 26 #include "net/proxy/mock_proxy_script_fetcher.h" |
| 26 #include "net/proxy/proxy_config.h" | 27 #include "net/proxy/proxy_config.h" |
| 27 #include "net/proxy/proxy_resolver.h" | 28 #include "net/proxy/proxy_resolver.h" |
| 28 #include "net/proxy/proxy_script_decider.h" | 29 #include "net/proxy/proxy_script_decider.h" |
| 29 #include "net/proxy/proxy_script_fetcher.h" | 30 #include "net/proxy/proxy_script_fetcher.h" |
| 30 #include "net/test/gtest_util.h" | 31 #include "net/test/gtest_util.h" |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 EXPECT_EQ(OK, decider.Start( | 204 EXPECT_EQ(OK, decider.Start( |
| 204 config, base::TimeDelta(), true, callback.callback())); | 205 config, base::TimeDelta(), true, callback.callback())); |
| 205 EXPECT_EQ(rule.text(), decider.script_data()->utf16()); | 206 EXPECT_EQ(rule.text(), decider.script_data()->utf16()); |
| 206 | 207 |
| 207 // Check the NetLog was filled correctly. | 208 // Check the NetLog was filled correctly. |
| 208 TestNetLogEntry::List entries; | 209 TestNetLogEntry::List entries; |
| 209 log.GetEntries(&entries); | 210 log.GetEntries(&entries); |
| 210 | 211 |
| 211 EXPECT_EQ(4u, entries.size()); | 212 EXPECT_EQ(4u, entries.size()); |
| 212 EXPECT_TRUE(LogContainsBeginEvent( | 213 EXPECT_TRUE(LogContainsBeginEvent( |
| 213 entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 214 entries, 0, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 214 EXPECT_TRUE(LogContainsBeginEvent( | 215 EXPECT_TRUE(LogContainsBeginEvent( |
| 215 entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 216 entries, 1, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 216 EXPECT_TRUE(LogContainsEndEvent( | 217 EXPECT_TRUE(LogContainsEndEvent( |
| 217 entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 218 entries, 2, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 218 EXPECT_TRUE(LogContainsEndEvent( | 219 EXPECT_TRUE(LogContainsEndEvent( |
| 219 entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 220 entries, 3, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 220 | 221 |
| 221 EXPECT_TRUE(decider.effective_config().has_pac_url()); | 222 EXPECT_TRUE(decider.effective_config().has_pac_url()); |
| 222 EXPECT_EQ(config.pac_url(), decider.effective_config().pac_url()); | 223 EXPECT_EQ(config.pac_url(), decider.effective_config().pac_url()); |
| 223 } | 224 } |
| 224 | 225 |
| 225 // Fail downloading the custom PAC script. | 226 // Fail downloading the custom PAC script. |
| 226 TEST(ProxyScriptDeciderTest, CustomPacFails1) { | 227 TEST(ProxyScriptDeciderTest, CustomPacFails1) { |
| 227 Rules rules; | 228 Rules rules; |
| 228 RuleBasedProxyScriptFetcher fetcher(&rules); | 229 RuleBasedProxyScriptFetcher fetcher(&rules); |
| 229 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; | 230 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 240 decider.Start(config, base::TimeDelta(), true, | 241 decider.Start(config, base::TimeDelta(), true, |
| 241 callback.callback())); | 242 callback.callback())); |
| 242 EXPECT_FALSE(decider.script_data()); | 243 EXPECT_FALSE(decider.script_data()); |
| 243 | 244 |
| 244 // Check the NetLog was filled correctly. | 245 // Check the NetLog was filled correctly. |
| 245 TestNetLogEntry::List entries; | 246 TestNetLogEntry::List entries; |
| 246 log.GetEntries(&entries); | 247 log.GetEntries(&entries); |
| 247 | 248 |
| 248 EXPECT_EQ(4u, entries.size()); | 249 EXPECT_EQ(4u, entries.size()); |
| 249 EXPECT_TRUE(LogContainsBeginEvent( | 250 EXPECT_TRUE(LogContainsBeginEvent( |
| 250 entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 251 entries, 0, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 251 EXPECT_TRUE(LogContainsBeginEvent( | 252 EXPECT_TRUE(LogContainsBeginEvent( |
| 252 entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 253 entries, 1, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 253 EXPECT_TRUE(LogContainsEndEvent( | 254 EXPECT_TRUE(LogContainsEndEvent( |
| 254 entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 255 entries, 2, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 255 EXPECT_TRUE(LogContainsEndEvent( | 256 EXPECT_TRUE(LogContainsEndEvent( |
| 256 entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 257 entries, 3, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 257 | 258 |
| 258 EXPECT_FALSE(decider.effective_config().has_pac_url()); | 259 EXPECT_FALSE(decider.effective_config().has_pac_url()); |
| 259 } | 260 } |
| 260 | 261 |
| 261 // Fail parsing the custom PAC script. | 262 // Fail parsing the custom PAC script. |
| 262 TEST(ProxyScriptDeciderTest, CustomPacFails2) { | 263 TEST(ProxyScriptDeciderTest, CustomPacFails2) { |
| 263 Rules rules; | 264 Rules rules; |
| 264 RuleBasedProxyScriptFetcher fetcher(&rules); | 265 RuleBasedProxyScriptFetcher fetcher(&rules); |
| 265 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; | 266 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; |
| 266 | 267 |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 ProxyConfig::CreateFromCustomPacURL(GURL("http://custom/proxy.pac")))); | 501 ProxyConfig::CreateFromCustomPacURL(GURL("http://custom/proxy.pac")))); |
| 501 | 502 |
| 502 // Check the NetLog was filled correctly. | 503 // Check the NetLog was filled correctly. |
| 503 // (Note that various states are repeated since both WPAD and custom | 504 // (Note that various states are repeated since both WPAD and custom |
| 504 // PAC scripts are tried). | 505 // PAC scripts are tried). |
| 505 TestNetLogEntry::List entries; | 506 TestNetLogEntry::List entries; |
| 506 log.GetEntries(&entries); | 507 log.GetEntries(&entries); |
| 507 | 508 |
| 508 EXPECT_EQ(10u, entries.size()); | 509 EXPECT_EQ(10u, entries.size()); |
| 509 EXPECT_TRUE(LogContainsBeginEvent( | 510 EXPECT_TRUE(LogContainsBeginEvent( |
| 510 entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 511 entries, 0, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 511 // This is the DHCP phase, which fails fetching rather than parsing, so | 512 // This is the DHCP phase, which fails fetching rather than parsing, so |
| 512 // there is no pair of SET_PAC_SCRIPT events. | 513 // there is no pair of SET_PAC_SCRIPT events. |
| 513 EXPECT_TRUE(LogContainsBeginEvent( | 514 EXPECT_TRUE(LogContainsBeginEvent( |
| 514 entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 515 entries, 1, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 515 EXPECT_TRUE(LogContainsEndEvent( | 516 EXPECT_TRUE(LogContainsEndEvent( |
| 516 entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 517 entries, 2, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 517 EXPECT_TRUE(LogContainsEvent( | 518 EXPECT_TRUE(LogContainsEvent( |
| 518 entries, 3, | 519 entries, 3, |
| 519 NetLog::TYPE_PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, | 520 NetLogEventType::PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, |
| 520 NetLog::PHASE_NONE)); | 521 NetLogEventPhase::NONE)); |
| 521 // This is the DNS phase, which attempts a fetch but fails. | 522 // This is the DNS phase, which attempts a fetch but fails. |
| 522 EXPECT_TRUE(LogContainsBeginEvent( | 523 EXPECT_TRUE(LogContainsBeginEvent( |
| 523 entries, 4, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 524 entries, 4, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 524 EXPECT_TRUE(LogContainsEndEvent( | 525 EXPECT_TRUE(LogContainsEndEvent( |
| 525 entries, 5, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 526 entries, 5, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 526 EXPECT_TRUE(LogContainsEvent( | 527 EXPECT_TRUE(LogContainsEvent( |
| 527 entries, 6, | 528 entries, 6, |
| 528 NetLog::TYPE_PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, | 529 NetLogEventType::PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, |
| 529 NetLog::PHASE_NONE)); | 530 NetLogEventPhase::NONE)); |
| 530 // Finally, the custom PAC URL phase. | 531 // Finally, the custom PAC URL phase. |
| 531 EXPECT_TRUE(LogContainsBeginEvent( | 532 EXPECT_TRUE(LogContainsBeginEvent( |
| 532 entries, 7, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 533 entries, 7, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 533 EXPECT_TRUE(LogContainsEndEvent( | 534 EXPECT_TRUE(LogContainsEndEvent( |
| 534 entries, 8, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 535 entries, 8, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 535 EXPECT_TRUE(LogContainsEndEvent( | 536 EXPECT_TRUE(LogContainsEndEvent( |
| 536 entries, 9, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 537 entries, 9, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 537 } | 538 } |
| 538 | 539 |
| 539 // Fails at WPAD (downloading), and fails at custom PAC (downloading). | 540 // Fails at WPAD (downloading), and fails at custom PAC (downloading). |
| 540 TEST(ProxyScriptDeciderTest, AutodetectFailCustomFails1) { | 541 TEST(ProxyScriptDeciderTest, AutodetectFailCustomFails1) { |
| 541 Rules rules; | 542 Rules rules; |
| 542 RuleBasedProxyScriptFetcher fetcher(&rules); | 543 RuleBasedProxyScriptFetcher fetcher(&rules); |
| 543 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; | 544 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; |
| 544 | 545 |
| 545 ProxyConfig config; | 546 ProxyConfig config; |
| 546 config.set_auto_detect(true); | 547 config.set_auto_detect(true); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 | 601 |
| 601 EXPECT_EQ(kFailedDownloading, callback.WaitForResult()); | 602 EXPECT_EQ(kFailedDownloading, callback.WaitForResult()); |
| 602 EXPECT_FALSE(decider.script_data()); | 603 EXPECT_FALSE(decider.script_data()); |
| 603 | 604 |
| 604 // Check the NetLog was filled correctly. | 605 // Check the NetLog was filled correctly. |
| 605 TestNetLogEntry::List entries; | 606 TestNetLogEntry::List entries; |
| 606 log.GetEntries(&entries); | 607 log.GetEntries(&entries); |
| 607 | 608 |
| 608 EXPECT_EQ(6u, entries.size()); | 609 EXPECT_EQ(6u, entries.size()); |
| 609 EXPECT_TRUE(LogContainsBeginEvent( | 610 EXPECT_TRUE(LogContainsBeginEvent( |
| 610 entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 611 entries, 0, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 611 EXPECT_TRUE(LogContainsBeginEvent( | 612 EXPECT_TRUE(LogContainsBeginEvent( |
| 612 entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_WAIT)); | 613 entries, 1, NetLogEventType::PROXY_SCRIPT_DECIDER_WAIT)); |
| 613 EXPECT_TRUE(LogContainsEndEvent( | 614 EXPECT_TRUE(LogContainsEndEvent( |
| 614 entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_WAIT)); | 615 entries, 2, NetLogEventType::PROXY_SCRIPT_DECIDER_WAIT)); |
| 615 EXPECT_TRUE(LogContainsBeginEvent( | 616 EXPECT_TRUE(LogContainsBeginEvent( |
| 616 entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 617 entries, 3, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 617 EXPECT_TRUE(LogContainsEndEvent( | 618 EXPECT_TRUE(LogContainsEndEvent( |
| 618 entries, 4, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 619 entries, 4, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 619 EXPECT_TRUE(LogContainsEndEvent( | 620 EXPECT_TRUE(LogContainsEndEvent( |
| 620 entries, 5, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 621 entries, 5, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 621 } | 622 } |
| 622 | 623 |
| 623 // This is a copy-paste of CustomPacFails1, with the exception that we give it | 624 // This is a copy-paste of CustomPacFails1, with the exception that we give it |
| 624 // a -5 second delay instead of a 0 ms delay. This change should have no effect | 625 // a -5 second delay instead of a 0 ms delay. This change should have no effect |
| 625 // so the rest of the test is unchanged. | 626 // so the rest of the test is unchanged. |
| 626 TEST(ProxyScriptDeciderTest, CustomPacFails1_WithNegativeDelay) { | 627 TEST(ProxyScriptDeciderTest, CustomPacFails1_WithNegativeDelay) { |
| 627 Rules rules; | 628 Rules rules; |
| 628 RuleBasedProxyScriptFetcher fetcher(&rules); | 629 RuleBasedProxyScriptFetcher fetcher(&rules); |
| 629 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; | 630 DoNothingDhcpProxyScriptFetcher dhcp_fetcher; |
| 630 | 631 |
| 631 ProxyConfig config; | 632 ProxyConfig config; |
| 632 config.set_pac_url(GURL("http://custom/proxy.pac")); | 633 config.set_pac_url(GURL("http://custom/proxy.pac")); |
| 633 | 634 |
| 634 rules.AddFailDownloadRule("http://custom/proxy.pac"); | 635 rules.AddFailDownloadRule("http://custom/proxy.pac"); |
| 635 | 636 |
| 636 TestCompletionCallback callback; | 637 TestCompletionCallback callback; |
| 637 TestNetLog log; | 638 TestNetLog log; |
| 638 ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); | 639 ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); |
| 639 EXPECT_EQ(kFailedDownloading, | 640 EXPECT_EQ(kFailedDownloading, |
| 640 decider.Start(config, base::TimeDelta::FromSeconds(-5), | 641 decider.Start(config, base::TimeDelta::FromSeconds(-5), |
| 641 true, callback.callback())); | 642 true, callback.callback())); |
| 642 EXPECT_FALSE(decider.script_data()); | 643 EXPECT_FALSE(decider.script_data()); |
| 643 | 644 |
| 644 // Check the NetLog was filled correctly. | 645 // Check the NetLog was filled correctly. |
| 645 TestNetLogEntry::List entries; | 646 TestNetLogEntry::List entries; |
| 646 log.GetEntries(&entries); | 647 log.GetEntries(&entries); |
| 647 | 648 |
| 648 EXPECT_EQ(4u, entries.size()); | 649 EXPECT_EQ(4u, entries.size()); |
| 649 EXPECT_TRUE(LogContainsBeginEvent( | 650 EXPECT_TRUE(LogContainsBeginEvent( |
| 650 entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 651 entries, 0, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 651 EXPECT_TRUE(LogContainsBeginEvent( | 652 EXPECT_TRUE(LogContainsBeginEvent( |
| 652 entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 653 entries, 1, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 653 EXPECT_TRUE(LogContainsEndEvent( | 654 EXPECT_TRUE(LogContainsEndEvent( |
| 654 entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); | 655 entries, 2, NetLogEventType::PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); |
| 655 EXPECT_TRUE(LogContainsEndEvent( | 656 EXPECT_TRUE(LogContainsEndEvent( |
| 656 entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); | 657 entries, 3, NetLogEventType::PROXY_SCRIPT_DECIDER)); |
| 657 } | 658 } |
| 658 | 659 |
| 659 class SynchronousSuccessDhcpFetcher : public DhcpProxyScriptFetcher { | 660 class SynchronousSuccessDhcpFetcher : public DhcpProxyScriptFetcher { |
| 660 public: | 661 public: |
| 661 explicit SynchronousSuccessDhcpFetcher(const base::string16& expected_text) | 662 explicit SynchronousSuccessDhcpFetcher(const base::string16& expected_text) |
| 662 : gurl_("http://dhcppac/"), expected_text_(expected_text) { | 663 : gurl_("http://dhcppac/"), expected_text_(expected_text) { |
| 663 } | 664 } |
| 664 | 665 |
| 665 int Fetch(base::string16* utf16_text, | 666 int Fetch(base::string16* utf16_text, |
| 666 const CompletionCallback& callback) override { | 667 const CompletionCallback& callback) override { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 | 790 |
| 790 // Run the message loop to let the DHCP fetch complete and post the results | 791 // Run the message loop to let the DHCP fetch complete and post the results |
| 791 // back. Before the fix linked to above, this would try to invoke on | 792 // back. Before the fix linked to above, this would try to invoke on |
| 792 // the callback object provided by ProxyScriptDecider after it was | 793 // the callback object provided by ProxyScriptDecider after it was |
| 793 // no longer valid. | 794 // no longer valid. |
| 794 base::RunLoop().RunUntilIdle(); | 795 base::RunLoop().RunUntilIdle(); |
| 795 } | 796 } |
| 796 | 797 |
| 797 } // namespace | 798 } // namespace |
| 798 } // namespace net | 799 } // namespace net |
| OLD | NEW |