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
} wxURLError;
class WXDLLEXPORT wxURL : public wxObject {
DECLARE_DYNAMIC_CLASS(wxURL)
protected:
static wxProtoInfo *g_protocols;
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; }
wxInputStream *GetInputStream();
#if wxUSE_SOCKETS
static wxHTTP *g_proxy;
#endif
static void SetDefaultProxy(const wxString& url_proxy);
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;
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;
@ -60,29 +83,14 @@ protected:
bool FetchProtocol();
friend class wxProtoInfo;
friend class wxProtocolModule;
public:
friend class wxURLModule;
wxURL(const wxString& url);
virtual ~wxURL();
private:
// 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
{ 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);
DECLARE_DYNAMIC_CLASS(wxURL)
};
#endif

View 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
}

View 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
// --------------------------------------------------------------
@ -51,10 +52,23 @@ wxURL::wxURL(const wxString& url)
m_protocol = NULL;
m_error = wxURL_NOERR;
m_url = url;
#if wxUSE_SOCKETS
m_useProxy = (g_proxy != NULL);
m_proxy = g_proxy;
#endif
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();
}
@ -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,13 +304,17 @@ 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;
}
}
else
{
wxString tmp_str = url_proxy;
int pos = tmp_str.Find(wxT(':'));
if (pos == -1)
@ -311,25 +329,29 @@ void wxURL::SetDefaultProxy(const wxString& url_proxy)
if (!addr.Service(port))
return;
if (g_proxy)
if (ms_proxyDefault)
// Finally, when all is right, we connect the new proxy.
g_proxy->Close();
ms_proxyDefault->Close();
else
g_proxy = new wxHTTP();
g_proxy->Connect(addr, TRUE); // Watcom needs the 2nd arg for some reason
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) {
if ( !url_proxy )
{
if ( m_proxy && m_proxy != ms_proxyDefault )
{
m_proxy->Close();
delete m_proxy;
}
m_useProxy = FALSE;
return;
}
m_useProxy = FALSE;
}
else
{
wxString tmp_str;
wxString hostname, port;
int pos;
@ -348,7 +370,7 @@ void wxURL::SetProxy(const wxString& url_proxy)
addr.Service(port);
// Finally, create the whole stuff.
if (m_proxy && m_proxy != g_proxy)
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
@ -357,8 +379,9 @@ void wxURL::SetProxy(const wxString& url_proxy)
// 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