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,54 +35,62 @@ typedef enum {
wxURL_PROTOERR wxURL_PROTOERR
} wxURLError; } wxURLError;
class WXDLLEXPORT wxURL : public wxObject { 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;
public: public:
wxURL(const wxString& url);
virtual ~wxURL();
wxURL(const wxString& url); wxString GetProtocolName() const { return m_protoinfo->m_protoname; }
virtual ~wxURL(); 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; }
inline wxString GetProtocolName() const wxInputStream *GetInputStream();
{ 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 #if wxUSE_SOCKETS
static void SetDefaultProxy(const wxString& url_proxy); static void SetDefaultProxy(const wxString& url_proxy);
void SetProxy(const wxString& url_proxy); void SetProxy(const wxString& url_proxy);
#endif #endif // wxUSE_SOCKETS
static wxString ConvertToValidURI(const wxString& uri); static wxString ConvertToValidURI(const wxString& uri);
static wxString ConvertFromURI(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;
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);
DECLARE_DYNAMIC_CLASS(wxURL)
}; };
#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
// -------------------------------------------------------------- // --------------------------------------------------------------
@ -48,14 +49,27 @@ wxHTTP *wxURL::g_proxy = NULL;
wxURL::wxURL(const wxString& url) 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"));
ParseURL();
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() bool wxURL::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,75 +304,84 @@ 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;
}
} }
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 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) void wxURL::SetProxy(const wxString& url_proxy)
{ {
if (url_proxy.IsNull()) { if ( !url_proxy )
if (m_proxy) { {
m_proxy->Close(); if ( m_proxy && m_proxy != ms_proxyDefault )
delete m_proxy; {
m_proxy->Close();
delete m_proxy;
}
m_useProxy = FALSE;
} }
m_useProxy = FALSE; else
return; {
} wxString tmp_str;
wxString hostname, port;
int pos;
wxIPV4address addr;
wxString tmp_str; tmp_str = url_proxy;
wxString hostname, port; pos = tmp_str.Find(wxT(':'));
int pos; // This is an invalid proxy name.
wxIPV4address addr; if (pos == -1)
return;
tmp_str = url_proxy; hostname = tmp_str(0, pos);
pos = tmp_str.Find(wxT(':')); port = tmp_str(pos, tmp_str.Length()-pos);
// This is an invalid proxy name.
if (pos == -1)
return;
hostname = tmp_str(0, pos); addr.Hostname(hostname);
port = tmp_str(pos, tmp_str.Length()-pos); addr.Service(port);
addr.Hostname(hostname); // Finally, create the whole stuff.
addr.Service(port); 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
// Finally, create the whole stuff. CleanData();
if (m_proxy && m_proxy != g_proxy) // Reparse url.
delete m_proxy; m_useProxy = TRUE;
m_proxy = new wxHTTP(); ParseURL();
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) 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