HTTP_PROXY bug (freeze on program startup) should be fixed

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6805 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-03-17 18:18:58 +00:00
parent fb04b3438d
commit b2b3552407
3 changed files with 182 additions and 150 deletions

View File

@@ -35,18 +35,41 @@ typedef enum {
wxURL_PROTOERR wxURL_PROTOERR
} wxURLError; } wxURLError;
class WXDLLEXPORT wxURL : public wxObject { class WXDLLEXPORT wxURL : public wxObject
DECLARE_DYNAMIC_CLASS(wxURL) {
protected: public:
static wxProtoInfo *g_protocols; 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; }
wxInputStream *GetInputStream();
#if wxUSE_SOCKETS #if wxUSE_SOCKETS
static wxHTTP *g_proxy; static void SetDefaultProxy(const wxString& url_proxy);
#endif void SetProxy(const wxString& url_proxy);
#endif // wxUSE_SOCKETS
static wxString ConvertToValidURI(const wxString& uri);
static wxString ConvertFromURI(const wxString& uri);
protected:
static wxProtoInfo *ms_protocols;
#if wxUSE_SOCKETS
static wxHTTP *ms_proxyDefault;
static bool ms_useDefaultProxy;
wxHTTP *m_proxy;
#endif // wxUSE_SOCKETS
wxProtoInfo *m_protoinfo; wxProtoInfo *m_protoinfo;
wxProtocol *m_protocol; wxProtocol *m_protocol;
#if wxUSE_SOCKETS
wxHTTP *m_proxy;
#endif
wxURLError m_error; wxURLError m_error;
wxString m_protoname, m_hostname, m_servname, m_path, m_url; wxString m_protoname, m_hostname, m_servname, m_path, m_url;
wxString m_user, m_password; wxString m_user, m_password;
@@ -60,29 +83,14 @@ protected:
bool FetchProtocol(); bool FetchProtocol();
friend class wxProtoInfo; friend class wxProtoInfo;
friend class wxProtocolModule; friend class wxURLModule;
public:
wxURL(const wxString& url); private:
virtual ~wxURL(); // VZ: can't use default copy ctor for this class, should write a correct
// one! (TODO)
DECLARE_NO_COPY_CLASS(wxURL);
inline wxString GetProtocolName() const DECLARE_DYNAMIC_CLASS(wxURL)
{ 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; }
wxInputStream *GetInputStream();
#if wxUSE_SOCKETS
static void SetDefaultProxy(const wxString& url_proxy);
void SetProxy(const wxString& url_proxy);
#endif
static wxString ConvertToValidURI(const wxString& uri);
static wxString ConvertFromURI(const wxString& uri);
}; };
#endif #endif

View File

@@ -43,8 +43,8 @@ wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv,
m_servname = serv; m_servname = serv;
m_cinfo = info; m_cinfo = info;
m_needhost = need_host1; m_needhost = need_host1;
next = wxURL::g_protocols; next = wxURL::ms_protocols;
wxURL::g_protocols = this; wxURL::ms_protocols = this;
} }
///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////
@@ -167,42 +167,3 @@ wxProtocolError GetLine(wxSocketBase *sock, wxString& result) {
#undef PROTO_BSIZE #undef PROTO_BSIZE
} }
#endif #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
}

View File

@@ -32,10 +32,11 @@ IMPLEMENT_CLASS(wxProtoInfo, wxObject)
IMPLEMENT_CLASS(wxURL, wxObject) IMPLEMENT_CLASS(wxURL, wxObject)
// Protocols list // Protocols list
wxProtoInfo *wxURL::g_protocols = NULL; wxProtoInfo *wxURL::ms_protocols = NULL;
#if wxUSE_SOCKETS #if wxUSE_SOCKETS
wxHTTP *wxURL::g_proxy = NULL; wxHTTP *wxURL::ms_proxyDefault = NULL;
bool wxURL::ms_useDefaultProxy = FALSE;
#endif #endif
// -------------------------------------------------------------- // --------------------------------------------------------------
@@ -51,10 +52,23 @@ wxURL::wxURL(const wxString& url)
m_protocol = NULL; m_protocol = NULL;
m_error = wxURL_NOERR; m_error = wxURL_NOERR;
m_url = url; m_url = url;
#if wxUSE_SOCKETS #if wxUSE_SOCKETS
m_useProxy = (g_proxy != NULL); if ( ms_useDefaultProxy && !ms_proxyDefault )
m_proxy = g_proxy; {
#endif 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(); ParseURL();
} }
@@ -130,7 +144,7 @@ wxURL::~wxURL()
{ {
CleanData(); CleanData();
#if wxUSE_SOCKETS #if wxUSE_SOCKETS
if (m_proxy && m_proxy != g_proxy) if (m_proxy && m_proxy != ms_proxyDefault)
delete m_proxy; delete m_proxy;
#endif #endif
} }
@@ -218,7 +232,7 @@ bool wxURL::PrepPath(wxString& url)
bool wxURL::FetchProtocol() bool wxURL::FetchProtocol()
{ {
wxProtoInfo *info = g_protocols; wxProtoInfo *info = ms_protocols;
while (info) { while (info) {
if (m_protoname == info->m_protoname) { if (m_protoname == info->m_protoname) {
@@ -290,13 +304,17 @@ wxInputStream *wxURL::GetInputStream()
#if wxUSE_SOCKETS #if wxUSE_SOCKETS
void wxURL::SetDefaultProxy(const wxString& url_proxy) void wxURL::SetDefaultProxy(const wxString& url_proxy)
{ {
if (url_proxy.IsNull()) { if ( !url_proxy )
g_proxy->Close(); {
delete g_proxy; if ( ms_proxyDefault )
g_proxy = NULL; {
return; ms_proxyDefault->Close();
delete ms_proxyDefault;
ms_proxyDefault = NULL;
} }
}
else
{
wxString tmp_str = url_proxy; wxString tmp_str = url_proxy;
int pos = tmp_str.Find(wxT(':')); int pos = tmp_str.Find(wxT(':'));
if (pos == -1) if (pos == -1)
@@ -311,25 +329,29 @@ void wxURL::SetDefaultProxy(const wxString& url_proxy)
if (!addr.Service(port)) if (!addr.Service(port))
return; return;
if (g_proxy) if (ms_proxyDefault)
// Finally, when all is right, we connect the new proxy. // Finally, when all is right, we connect the new proxy.
g_proxy->Close(); ms_proxyDefault->Close();
else else
g_proxy = new wxHTTP(); ms_proxyDefault = new wxHTTP();
g_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason ms_proxyDefault->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
}
} }
void wxURL::SetProxy(const wxString& url_proxy) void wxURL::SetProxy(const wxString& url_proxy)
{ {
if (url_proxy.IsNull()) { if ( !url_proxy )
if (m_proxy) { {
if ( m_proxy && m_proxy != ms_proxyDefault )
{
m_proxy->Close(); m_proxy->Close();
delete m_proxy; delete m_proxy;
} }
m_useProxy = FALSE;
return;
}
m_useProxy = FALSE;
}
else
{
wxString tmp_str; wxString tmp_str;
wxString hostname, port; wxString hostname, port;
int pos; int pos;
@@ -348,7 +370,7 @@ void wxURL::SetProxy(const wxString& url_proxy)
addr.Service(port); addr.Service(port);
// Finally, create the whole stuff. // Finally, create the whole stuff.
if (m_proxy && m_proxy != g_proxy) if (m_proxy && m_proxy != ms_proxyDefault)
delete m_proxy; delete m_proxy;
m_proxy = new wxHTTP(); m_proxy = new wxHTTP();
m_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason m_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
@@ -358,7 +380,8 @@ void wxURL::SetProxy(const wxString& url_proxy)
m_useProxy = TRUE; m_useProxy = TRUE;
ParseURL(); ParseURL();
} }
#endif }
#endif // wxUSE_SOCKETS
wxString wxURL::ConvertToValidURI(const wxString& uri) wxString wxURL::ConvertToValidURI(const wxString& uri)
{ {
@@ -410,3 +433,43 @@ wxString wxURL::ConvertFromURI(const wxString& uri)
} }
return new_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