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
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
// --------------------------------------------------------------
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()
{
CleanData();
#if wxUSE_SOCKETS
- if (m_proxy && m_proxy != g_proxy)
+ if (m_proxy && m_proxy != ms_proxyDefault)
delete m_proxy;
#endif
}
bool wxURL::FetchProtocol()
{
- wxProtoInfo *info = g_protocols;
+ wxProtoInfo *info = ms_protocols;
while (info) {
if (m_protoname == info->m_protoname) {
#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)
{
}
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