]> git.saurik.com Git - wxWidgets.git/commitdiff
HTTP_PROXY bug (freeze on program startup) should be fixed
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 17 Mar 2000 18:18:58 +0000 (18:18 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 17 Mar 2000 18:18:58 +0000 (18:18 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6805 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/url.h
src/common/protocol.cpp
src/common/url.cpp

index 40ff50c370ade5bc570086cd89b4e7943e73fade..6b1518758511593b7bbb70c26a96d77c270f49fd 100644 (file)
@@ -35,54 +35,62 @@ typedef enum {
   wxURL_PROTOERR
 } wxURLError;
   
-class WXDLLEXPORT wxURL : public wxObject {
-  DECLARE_DYNAMIC_CLASS(wxURL)
-protected:
-  static wxProtoInfo *g_protocols;
-#if wxUSE_SOCKETS
-  static wxHTTP *g_proxy;
-#endif
-  wxProtoInfo *m_protoinfo;
-  wxProtocol *m_protocol;
-#if wxUSE_SOCKETS
-  wxHTTP *m_proxy;
-#endif
-  wxURLError m_error;
-  wxString m_protoname, m_hostname, m_servname, m_path, m_url;
-  wxString m_user, m_password;
-  bool m_useProxy;
-
-  bool PrepProto(wxString& url);
-  bool PrepHost(wxString& url);
-  bool PrepPath(wxString& url);
-  bool ParseURL();
-  void CleanData();
-  bool FetchProtocol();
-
-  friend class wxProtoInfo;
-  friend class wxProtocolModule;
+class WXDLLEXPORT wxURL : public wxObject
+{
 public:
+    wxURL(const wxString& url);
+    virtual ~wxURL();
+
+    wxString GetProtocolName() const { return m_protoinfo->m_protoname; }
+    wxString GetHostName() const { return m_hostname; }
+    wxString GetURL() const { return m_url; }
+    wxProtocol& GetProtocol() { return *m_protocol; }
+    wxURLError GetError() const { return m_error; }
+    wxString GetPath() const { return m_path; }
 
-  wxURL(const wxString& url);
-  virtual ~wxURL();
+    wxInputStream *GetInputStream();
 
-  inline wxString GetProtocolName() const
-        { return m_protoinfo->m_protoname; }
-  inline wxString GetHostName() const { return m_hostname; }
-  inline wxString GetURL() const { return m_url; }
-  inline wxProtocol& GetProtocol() { return *m_protocol; }
-  inline wxURLError GetError() const { return m_error; }
-  inline wxString GetPath() const { return m_path; }
+#if wxUSE_SOCKETS
+    static void SetDefaultProxy(const wxString& url_proxy);
+    void SetProxy(const wxString& url_proxy);
+#endif // wxUSE_SOCKETS
 
-  wxInputStream *GetInputStream();
+    static wxString ConvertToValidURI(const wxString& uri);
+    static wxString ConvertFromURI(const wxString& uri);
+
+protected:
+    static wxProtoInfo *ms_protocols;
 
 #if wxUSE_SOCKETS
-  static void SetDefaultProxy(const wxString& url_proxy);
-  void SetProxy(const wxString& url_proxy);
-#endif
+    static wxHTTP *ms_proxyDefault;
+    static bool ms_useDefaultProxy;
+    wxHTTP *m_proxy;
+#endif // wxUSE_SOCKETS
+
+    wxProtoInfo *m_protoinfo;
+    wxProtocol *m_protocol;
+
+    wxURLError m_error;
+    wxString m_protoname, m_hostname, m_servname, m_path, m_url;
+    wxString m_user, m_password;
+    bool m_useProxy;
+
+    bool PrepProto(wxString& url);
+    bool PrepHost(wxString& url);
+    bool PrepPath(wxString& url);
+    bool ParseURL();
+    void CleanData();
+    bool FetchProtocol();
+
+    friend class wxProtoInfo;
+    friend class wxURLModule;
+
+private:
+    // VZ: can't use default copy ctor for this class, should write a correct
+    //     one! (TODO)
+    DECLARE_NO_COPY_CLASS(wxURL);
 
-  static wxString ConvertToValidURI(const wxString& uri);
-  static wxString ConvertFromURI(const wxString& uri);
+    DECLARE_DYNAMIC_CLASS(wxURL)
 };
 
 #endif
index 875ad85af0bc02e7a45c44170415a8b7a9b1cf95..2203ac231f4ee76b6f1c05f5ab67fb767c1f6c24 100644 (file)
@@ -43,8 +43,8 @@ wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv,
   m_servname = serv;
   m_cinfo = info;
   m_needhost = need_host1;
-  next = wxURL::g_protocols;
-  wxURL::g_protocols = this;
+  next = wxURL::ms_protocols;
+  wxURL::ms_protocols = this;
 }
 
 /////////////////////////////////////////////////////////////////
@@ -167,42 +167,3 @@ wxProtocolError GetLine(wxSocketBase *sock, wxString& result) {
 #undef PROTO_BSIZE
 }
 #endif
-
-// ----------------------------------------------------------------------
-// Module
-// ----------------------------------------------------------------------
-
-class wxProtocolModule: public wxModule {
-  DECLARE_DYNAMIC_CLASS(wxProtocolModule)
-public:
-  wxProtocolModule() {}
-  bool OnInit();
-  void OnExit();
-};
-
-IMPLEMENT_DYNAMIC_CLASS(wxProtocolModule, wxModule)
-
-bool wxProtocolModule::OnInit()
-{
-#if wxUSE_SOCKETS
-  char *env_http_prox;
-
-  wxURL::g_proxy = NULL;
-  // Initialize the proxy when HTTP_PROXY is defined
-  env_http_prox = getenv("HTTP_PROXY");
-  if (env_http_prox)
-    wxURL::SetDefaultProxy(env_http_prox);
-#endif
-  
-  return TRUE;
-}
-
-void wxProtocolModule::OnExit()
-{
-#if wxUSE_SOCKETS
-  if (wxURL::g_proxy)
-    delete wxURL::g_proxy;
-  wxURL::g_proxy = NULL;
-#endif
-}
-
index 8c680f6905fda10fb88bbaff181d34a40a3bbfe4..25268e90d4a75011648c7a6f0049d5ad6162cf01 100644 (file)
@@ -32,10 +32,11 @@ IMPLEMENT_CLASS(wxProtoInfo, wxObject)
 IMPLEMENT_CLASS(wxURL, wxObject)
 
 // Protocols list
-wxProtoInfo *wxURL::g_protocols = NULL;
+wxProtoInfo *wxURL::ms_protocols = NULL;
 
 #if wxUSE_SOCKETS
-wxHTTP *wxURL::g_proxy = NULL;
+    wxHTTP *wxURL::ms_proxyDefault = NULL;
+    bool wxURL::ms_useDefaultProxy = FALSE;
 #endif
 
 // --------------------------------------------------------------
@@ -48,14 +49,27 @@ wxHTTP *wxURL::g_proxy = NULL;
 
 wxURL::wxURL(const wxString& url)
 {
-  m_protocol = NULL;
-  m_error = wxURL_NOERR;
-  m_url = url;
+    m_protocol = NULL;
+    m_error = wxURL_NOERR;
+    m_url = url;
+
 #if wxUSE_SOCKETS
-  m_useProxy = (g_proxy != NULL);
-  m_proxy = g_proxy;
-#endif
-  ParseURL();
+    if ( ms_useDefaultProxy && !ms_proxyDefault )
+    {
+        SetDefaultProxy(getenv("HTTP_PROXY"));
+
+        if ( !ms_proxyDefault )
+        {
+            // don't try again
+            ms_useDefaultProxy = FALSE;
+        }
+    }
+
+    m_useProxy = ms_proxyDefault != NULL;
+    m_proxy = ms_proxyDefault;
+#endif // wxUSE_SOCKETS
+
+    ParseURL();
 }
 
 bool wxURL::ParseURL()
@@ -130,7 +144,7 @@ wxURL::~wxURL()
 {
   CleanData();
 #if wxUSE_SOCKETS
-  if (m_proxy && m_proxy != g_proxy)
+  if (m_proxy && m_proxy != ms_proxyDefault)
     delete m_proxy;
 #endif
 }
@@ -218,7 +232,7 @@ bool wxURL::PrepPath(wxString& url)
 
 bool wxURL::FetchProtocol()
 {
-  wxProtoInfo *info = g_protocols;
+  wxProtoInfo *info = ms_protocols;
 
   while (info) {
     if (m_protoname == info->m_protoname) {
@@ -290,75 +304,84 @@ wxInputStream *wxURL::GetInputStream()
 #if wxUSE_SOCKETS
 void wxURL::SetDefaultProxy(const wxString& url_proxy)
 {
-  if (url_proxy.IsNull()) {
-    g_proxy->Close();
-    delete g_proxy;
-    g_proxy = NULL;
-    return;
+  if ( !url_proxy )
+  {
+      if ( ms_proxyDefault )
+      {
+          ms_proxyDefault->Close();
+          delete ms_proxyDefault;
+          ms_proxyDefault = NULL;
+      }
   }
-
-  wxString tmp_str = url_proxy;
-  int pos = tmp_str.Find(wxT(':'));
-  if (pos == -1)
-    return;
-
-  wxString hostname = tmp_str(0, pos),
-           port = tmp_str(pos+1, tmp_str.Length()-pos);
-  wxIPV4address addr;
-
-  if (!addr.Hostname(hostname))
-    return;
-  if (!addr.Service(port))
-    return;
-
-  if (g_proxy)
-  // Finally, when all is right, we connect the new proxy.
-    g_proxy->Close();
   else
-    g_proxy = new wxHTTP();
-  g_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
+  {
+      wxString tmp_str = url_proxy;
+      int pos = tmp_str.Find(wxT(':'));
+      if (pos == -1)
+          return;
+
+      wxString hostname = tmp_str(0, pos),
+      port = tmp_str(pos+1, tmp_str.Length()-pos);
+      wxIPV4address addr;
+
+      if (!addr.Hostname(hostname))
+          return;
+      if (!addr.Service(port))
+          return;
+
+      if (ms_proxyDefault)
+          // Finally, when all is right, we connect the new proxy.
+          ms_proxyDefault->Close();
+      else
+          ms_proxyDefault = new wxHTTP();
+      ms_proxyDefault->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
+  }
 }
 
 void wxURL::SetProxy(const wxString& url_proxy)
 {
-  if (url_proxy.IsNull()) {
-    if (m_proxy) {
-      m_proxy->Close();
-      delete m_proxy;
-    }
-    m_useProxy = FALSE;
-    return;
-  }
-
-  wxString tmp_str;
-  wxString hostname, port;
-  int pos;
-  wxIPV4address addr;
-
-  tmp_str = url_proxy;
-  pos = tmp_str.Find(wxT(':'));
-  // This is an invalid proxy name.
-  if (pos == -1)
-    return;
-
-  hostname = tmp_str(0, pos);
-  port = tmp_str(pos, tmp_str.Length()-pos);
-
-  addr.Hostname(hostname);
-  addr.Service(port);
-
-  // Finally, create the whole stuff.
-  if (m_proxy && m_proxy != g_proxy)
-    delete m_proxy;
-  m_proxy = new wxHTTP();
-  m_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
+    if ( !url_proxy )
+    {
+        if ( m_proxy && m_proxy != ms_proxyDefault )
+        {
+            m_proxy->Close();
+            delete m_proxy;
+        }
 
-  CleanData();
-  // Reparse url.
-  m_useProxy = TRUE;
-  ParseURL();
+        m_useProxy = FALSE;
+    }
+    else
+    {
+        wxString tmp_str;
+        wxString hostname, port;
+        int pos;
+        wxIPV4address addr;
+
+        tmp_str = url_proxy;
+        pos = tmp_str.Find(wxT(':'));
+        // This is an invalid proxy name.
+        if (pos == -1)
+            return;
+
+        hostname = tmp_str(0, pos);
+        port = tmp_str(pos, tmp_str.Length()-pos);
+
+        addr.Hostname(hostname);
+        addr.Service(port);
+
+        // Finally, create the whole stuff.
+        if (m_proxy && m_proxy != ms_proxyDefault)
+            delete m_proxy;
+        m_proxy = new wxHTTP();
+        m_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
+
+        CleanData();
+        // Reparse url.
+        m_useProxy = TRUE;
+        ParseURL();
+    }
 }
-#endif
+#endif // wxUSE_SOCKETS
 
 wxString wxURL::ConvertToValidURI(const wxString& uri)
 {
@@ -410,3 +433,43 @@ wxString wxURL::ConvertFromURI(const wxString& uri)
   }
   return new_uri;
 }
+
+// ----------------------------------------------------------------------
+// A module which deletes the default proxy if we created it
+// ----------------------------------------------------------------------
+
+#if wxUSE_SOCKETS
+
+class wxURLModule : public wxModule
+{
+public:
+    virtual bool OnInit();
+    virtual void OnExit();
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxURLModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxURLModule, wxModule)
+
+bool wxURLModule::OnInit()
+{
+    // env var HTTP_PROXY contains the address of the default proxy to use if
+    // set, but don't try to create this proxy right now because it will slow
+    // down the program startup (especially if there is no DNS server
+    // available, in which case it may take up to 1 minute)
+    if ( getenv("HTTP_PROXY") )
+    {
+        wxURL::ms_useDefaultProxy = TRUE;
+    }
+
+    return TRUE;
+}
+
+void wxURLModule::OnExit()
+{
+    delete wxURL::ms_proxyDefault;
+    wxURL::ms_proxyDefault = NULL;
+}
+
+#endif // wxUSE_SOCKETS