X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2523e9b70044baa92a1c63ffdfe179c28ad53536..0758c46ee65053bc70bd0ef5a73fb30aeec7986c:/src/common/http.cpp?ds=sidebyside diff --git a/src/common/http.cpp b/src/common/http.cpp index f8977ecedf..145ec61f3c 100644 --- a/src/common/http.cpp +++ b/src/common/http.cpp @@ -32,6 +32,12 @@ #include "wx/url.h" #include "wx/protocol/http.h" #include "wx/sckstrm.h" +#include "wx/thread.h" + + +// ---------------------------------------------------------------------------- +// wxHTTP +// ---------------------------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxHTTP, wxProtocol) IMPLEMENT_PROTOCOL(wxHTTP, wxT("http"), wxT("80"), true) @@ -57,10 +63,10 @@ wxHTTP::~wxHTTP() void wxHTTP::ClearHeaders() { - m_headers.clear(); + m_headers.clear(); } -wxString wxHTTP::GetContentType() +wxString wxHTTP::GetContentType() const { return GetHeader(wxT("Content-Type")); } @@ -75,7 +81,7 @@ wxHTTP::wxHeaderIterator wxHTTP::FindHeader(const wxString& header) wxHeaderIterator it = m_headers.begin(); for ( wxHeaderIterator en = m_headers.end(); it != en; ++it ) { - if ( wxStricmp(it->first, header) == 0 ) + if ( header.CmpNoCase(it->first) == 0 ) break; } @@ -87,7 +93,7 @@ wxHTTP::wxHeaderConstIterator wxHTTP::FindHeader(const wxString& header) const wxHeaderConstIterator it = m_headers.begin(); for ( wxHeaderConstIterator en = m_headers.end(); it != en; ++it ) { - if ( wxStricmp(it->first, header) == 0 ) + if ( header.CmpNoCase(it->first) == 0 ) break; } @@ -176,8 +182,8 @@ bool wxHTTP::ParseHeaders() for ( ;; ) { - m_perr = ReadLine(this, line); - if (m_perr != wxPROTO_NOERR) + m_lastError = ReadLine(this, line); + if (m_lastError != wxPROTO_NOERR) return false; if (line.length() == 0) @@ -204,7 +210,7 @@ bool wxHTTP::Connect(const wxString& host, unsigned short port) if (!addr->Hostname(host)) { delete m_addr; m_addr = NULL; - m_perr = wxPROTO_NETERR; + m_lastError = wxPROTO_NETERR; return false; } @@ -213,12 +219,16 @@ bool wxHTTP::Connect(const wxString& host, unsigned short port) else if (!addr->Service(wxT("http"))) addr->Service(80); - SetHeader(wxT("Host"), host); + wxString hostHdr = host; + if ( port && port != 80 ) + hostHdr << wxT(":") << port; + SetHeader(wxT("Host"), hostHdr); + m_lastError = wxPROTO_NOERR; return true; } -bool wxHTTP::Connect(wxSockAddress& addr, bool WXUNUSED(wait)) +bool wxHTTP::Connect(const wxSockAddress& addr, bool WXUNUSED(wait)) { if (m_addr) { delete m_addr; @@ -228,9 +238,16 @@ bool wxHTTP::Connect(wxSockAddress& addr, bool WXUNUSED(wait)) m_addr = addr.Clone(); wxIPV4address *ipv4addr = wxDynamicCast(&addr, wxIPV4address); - if (ipv4addr) - SetHeader(wxT("Host"), ipv4addr->OrigHostname()); + if ( ipv4addr ) + { + wxString hostHdr = ipv4addr->OrigHostname(); + unsigned short port = ipv4addr->Service(); + if ( port && port != 80 ) + hostHdr << wxT(":") << port; + SetHeader(wxT("Host"), hostHdr); + } + m_lastError = wxPROTO_NOERR; return true; } @@ -274,8 +291,8 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req) wxString buf; buf.Printf(wxT("%s %s HTTP/1.0\r\n"), request, path.c_str()); - const wxWX2MBbuf pathbuf = wxConvLocal.cWX2MB(buf); - Write(pathbuf, strlen(wxMBSTRINGCAST pathbuf)); + const wxWX2MBbuf pathbuf = buf.mb_str(); + Write(pathbuf, strlen(pathbuf)); SendHeaders(); Write("\r\n", 2); @@ -285,8 +302,8 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req) } wxString tmp_str; - m_perr = ReadLine(this, tmp_str); - if (m_perr != wxPROTO_NOERR) { + m_lastError = ReadLine(this, tmp_str); + if (m_lastError != wxPROTO_NOERR) { RestoreState(); return false; } @@ -294,6 +311,7 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req) if (!tmp_str.Contains(wxT("HTTP/"))) { // TODO: support HTTP v0.9 which can have no header. // FIXME: tmp_str is not put back in the in-queue of the socket. + m_lastError = wxPROTO_NOERR; SetHeader(wxT("Content-Length"), wxT("-1")); SetHeader(wxT("Content-Type"), wxT("none/none")); RestoreState(); @@ -324,16 +342,26 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req) break; default: - m_perr = wxPROTO_NOFILE; + m_lastError = wxPROTO_NOFILE; RestoreState(); return false; } + m_lastError = wxPROTO_NOERR; ret_value = ParseHeaders(); RestoreState(); return ret_value; } +bool wxHTTP::Abort(void) +{ + return wxSocketClient::Close(); +} + +// ---------------------------------------------------------------------------- +// wxHTTPStream and wxHTTP::GetInputStream +// ---------------------------------------------------------------------------- + class wxHTTPStream : public wxSocketInputStream { public: @@ -348,7 +376,7 @@ public: protected: size_t OnSysRead(void *buffer, size_t bufsize); - DECLARE_NO_COPY_CLASS(wxHTTPStream) + wxDECLARE_NO_COPY_CLASS(wxHTTPStream); }; size_t wxHTTPStream::OnSysRead(void *buffer, size_t bufsize) @@ -368,24 +396,19 @@ size_t wxHTTPStream::OnSysRead(void *buffer, size_t bufsize) // which is equivalent to getting a READ_ERROR, for clients however this // must be translated into EOF, as it is the expected way of signalling // end end of the content - m_lasterror = wxSTREAM_EOF ; + m_lasterror = wxSTREAM_EOF; } return ret; } -bool wxHTTP::Abort(void) -{ - return wxSocketClient::Close(); -} - wxInputStream *wxHTTP::GetInputStream(const wxString& path) { wxHTTPStream *inp_stream; wxString new_path; - m_perr = wxPROTO_CONNERR; + m_lastError = wxPROTO_CONNERR; // all following returns share this type of error if (!m_addr) return NULL; @@ -407,7 +430,7 @@ wxInputStream *wxHTTP::GetInputStream(const wxString& path) inp_stream = new wxHTTPStream(this); if (!GetHeader(wxT("Content-Length")).empty()) - inp_stream->m_httpsize = wxAtoi(WXSTRINGCAST GetHeader(wxT("Content-Length"))); + inp_stream->m_httpsize = wxAtoi(GetHeader(wxT("Content-Length"))); else inp_stream->m_httpsize = (size_t)-1; @@ -416,6 +439,8 @@ wxInputStream *wxHTTP::GetInputStream(const wxString& path) Notify(false); SetFlags(wxSOCKET_BLOCK | wxSOCKET_WAITALL); + // no error; reset m_lastError + m_lastError = wxPROTO_NOERR; return inp_stream; }