Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/proxy/proxy_config_service_linux.h" | 5 #include "net/proxy/proxy_config_service_linux.h" |
| 6 | 6 |
| 7 #include <gconf/gconf-client.h> | 7 #include <gconf/gconf-client.h> |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/string_tokenizer.h" | 11 #include "base/string_tokenizer.h" |
| 12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/task.h" | 13 #include "base/task.h" |
| 14 #include "googleurl/src/url_canon.h" | 14 #include "googleurl/src/url_canon.h" |
| 15 #include "net/base/net_errors.h" | 15 #include "net/base/net_errors.h" |
| 16 #include "net/http/http_util.h" | 16 #include "net/http/http_util.h" |
| 17 #include "net/proxy/proxy_config.h" | 17 #include "net/proxy/proxy_config.h" |
| 18 #include "net/proxy/proxy_server.h" | 18 #include "net/proxy/proxy_server.h" |
| 19 | 19 |
| 20 namespace net { | 20 namespace net { |
| 21 | 21 |
| 22 namespace { | 22 namespace { |
| 23 | 23 |
| 24 class EnvironmentVariableGetterImpl | |
| 25 : public ProxyConfigServiceLinux::EnvironmentVariableGetter { | |
| 26 public: | |
| 27 virtual bool Getenv(const char* variable_name, std::string* result) { | |
| 28 const char* env_value = ::getenv(variable_name); | |
| 29 if (env_value) { | |
| 30 // Note that the variable may be defined but empty. | |
| 31 *result = env_value; | |
| 32 return true; | |
| 33 } | |
| 34 // Some commonly used variable names are uppercase while others | |
| 35 // are lowercase, which is inconsistent. Let's try to be helpful | |
| 36 // and look for a variable name with the reverse case. | |
| 37 char first_char = variable_name[0]; | |
| 38 std::string alternate_case_var; | |
| 39 if (first_char >= 'a' && first_char <= 'z') | |
| 40 alternate_case_var = StringToUpperASCII(std::string(variable_name)); | |
| 41 else if (first_char >= 'A' && first_char <= 'Z') | |
| 42 alternate_case_var = StringToLowerASCII(std::string(variable_name)); | |
| 43 else | |
| 44 return false; | |
| 45 env_value = ::getenv(alternate_case_var.c_str()); | |
| 46 if (env_value) { | |
| 47 *result = env_value; | |
| 48 return true; | |
| 49 } | |
| 50 return false; | |
| 51 } | |
| 52 }; | |
| 53 | |
| 54 // Given a proxy hostname from a setting, returns that hostname with | 24 // Given a proxy hostname from a setting, returns that hostname with |
| 55 // an appropriate proxy server scheme prefix. | 25 // an appropriate proxy server scheme prefix. |
| 56 // scheme indicates the desired proxy scheme: usually http, with | 26 // scheme indicates the desired proxy scheme: usually http, with |
| 57 // socks 4 or 5 as special cases. | 27 // socks 4 or 5 as special cases. |
| 58 // TODO(arindam): Remove URI string manipulation by using MapUrlSchemeToProxy. | 28 // TODO(arindam): Remove URI string manipulation by using MapUrlSchemeToProxy. |
| 59 std::string FixupProxyHostScheme(ProxyServer::Scheme scheme, | 29 std::string FixupProxyHostScheme(ProxyServer::Scheme scheme, |
| 60 std::string host) { | 30 std::string host) { |
| 61 if (scheme == ProxyServer::SCHEME_SOCKS4 && | 31 if (scheme == ProxyServer::SCHEME_SOCKS4 && |
| 62 StartsWithASCII(host, "socks5://", false)) { | 32 StartsWithASCII(host, "socks5://", false)) { |
| 63 // We default to socks 4, but if the user specifically set it to | 33 // We default to socks 4, but if the user specifically set it to |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 521 // Now the bypass list. | 491 // Now the bypass list. |
| 522 gconf_getter_->GetStringList("/system/http_proxy/ignore_hosts", | 492 gconf_getter_->GetStringList("/system/http_proxy/ignore_hosts", |
| 523 &config->proxy_bypass); | 493 &config->proxy_bypass); |
| 524 // Note that there are no settings with semantics corresponding to | 494 // Note that there are no settings with semantics corresponding to |
| 525 // config->proxy_bypass_local_names. | 495 // config->proxy_bypass_local_names. |
| 526 | 496 |
| 527 return true; | 497 return true; |
| 528 } | 498 } |
| 529 | 499 |
| 530 ProxyConfigServiceLinux::Delegate::Delegate( | 500 ProxyConfigServiceLinux::Delegate::Delegate( |
| 531 EnvironmentVariableGetter* env_var_getter, | 501 base::EnvironmentVariableGetter* env_var_getter, |
| 532 GConfSettingGetter* gconf_getter) | 502 GConfSettingGetter* gconf_getter) |
| 533 : env_var_getter_(env_var_getter), gconf_getter_(gconf_getter), | 503 : env_var_getter_(env_var_getter), gconf_getter_(gconf_getter), |
| 534 glib_default_loop_(NULL), io_loop_(NULL) { | 504 glib_default_loop_(NULL), io_loop_(NULL) { |
| 535 } | 505 } |
| 536 | 506 |
| 537 bool ProxyConfigServiceLinux::Delegate::ShouldTryGConf() { | 507 bool ProxyConfigServiceLinux::Delegate::ShouldTryGConf() { |
| 538 // GNOME_DESKTOP_SESSION_ID being defined is a good indication that | |
| 539 // we are probably running under GNOME. | |
| 540 // Note: KDE_FULL_SESSION is a corresponding env var to recognize KDE. | |
| 541 std::string dummy, desktop_session; | |
| 542 return env_var_getter_->Getenv("GNOME_DESKTOP_SESSION_ID", &dummy) | |
| 543 || (env_var_getter_->Getenv("DESKTOP_SESSION", &desktop_session) | |
| 544 && desktop_session == "gnome"); | |
| 545 // I (sdoyon) would have liked to prioritize environment variables | 508 // I (sdoyon) would have liked to prioritize environment variables |
|
eroman
2009/07/22 00:33:30
seems this comment should be moved into UseGnomeFo
| |
| 546 // and only fallback to gconf if env vars were unset. But | 509 // and only fallback to gconf if env vars were unset. But |
| 547 // gnome-terminal "helpfully" sets http_proxy and no_proxy, and it | 510 // gnome-terminal "helpfully" sets http_proxy and no_proxy, and it |
| 548 // does so even if the proxy mode is set to auto, which would | 511 // does so even if the proxy mode is set to auto, which would |
| 549 // mislead us. | 512 // mislead us. |
| 550 // | 513 // |
| 551 // We could introduce a CHROME_PROXY_OBEY_ENV_VARS variable...?? | 514 // We could introduce a CHROME_PROXY_OBEY_ENV_VARS variable...?? |
| 515 return base::UseGnomeForSettings(env_var_getter_.get()); | |
| 552 } | 516 } |
| 553 | 517 |
| 554 void ProxyConfigServiceLinux::Delegate::SetupAndFetchInitialConfig( | 518 void ProxyConfigServiceLinux::Delegate::SetupAndFetchInitialConfig( |
| 555 MessageLoop* glib_default_loop, MessageLoop* io_loop) { | 519 MessageLoop* glib_default_loop, MessageLoop* io_loop) { |
| 556 // We should be running on the default glib main loop thread right | 520 // We should be running on the default glib main loop thread right |
| 557 // now. gconf can only be accessed from this thread. | 521 // now. gconf can only be accessed from this thread. |
| 558 DCHECK(MessageLoop::current() == glib_default_loop); | 522 DCHECK(MessageLoop::current() == glib_default_loop); |
| 559 glib_default_loop_ = glib_default_loop; | 523 glib_default_loop_ = glib_default_loop; |
| 560 io_loop_ = io_loop; | 524 io_loop_ = io_loop; |
| 561 | 525 |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 666 this, | 630 this, |
| 667 &ProxyConfigServiceLinux::Delegate::OnDestroy)); | 631 &ProxyConfigServiceLinux::Delegate::OnDestroy)); |
| 668 } | 632 } |
| 669 } | 633 } |
| 670 void ProxyConfigServiceLinux::Delegate::OnDestroy() { | 634 void ProxyConfigServiceLinux::Delegate::OnDestroy() { |
| 671 DCHECK(!glib_default_loop_ || MessageLoop::current() == glib_default_loop_); | 635 DCHECK(!glib_default_loop_ || MessageLoop::current() == glib_default_loop_); |
| 672 gconf_getter_->Release(); | 636 gconf_getter_->Release(); |
| 673 } | 637 } |
| 674 | 638 |
| 675 ProxyConfigServiceLinux::ProxyConfigServiceLinux() | 639 ProxyConfigServiceLinux::ProxyConfigServiceLinux() |
| 676 : delegate_(new Delegate(new EnvironmentVariableGetterImpl(), | 640 : delegate_(new Delegate(base::EnvironmentVariableGetter::Create(), |
| 677 new GConfSettingGetterImpl())) { | 641 new GConfSettingGetterImpl())) { |
| 678 } | 642 } |
| 679 | 643 |
| 680 ProxyConfigServiceLinux::ProxyConfigServiceLinux( | 644 ProxyConfigServiceLinux::ProxyConfigServiceLinux( |
| 681 EnvironmentVariableGetter* env_var_getter, | 645 base::EnvironmentVariableGetter* env_var_getter, |
| 682 GConfSettingGetter* gconf_getter) | 646 GConfSettingGetter* gconf_getter) |
| 683 : delegate_(new Delegate(env_var_getter, gconf_getter)) { | 647 : delegate_(new Delegate(env_var_getter, gconf_getter)) { |
| 684 } | 648 } |
| 685 | 649 |
| 686 } // namespace net | 650 } // namespace net |
| OLD | NEW |