]>
git.saurik.com Git - wxWidgets.git/blob - src/common/http.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: HTTP protocol
4 // Author: Guilhem Lavaux
6 // Created: August 1997
8 // Copyright: (c) 1997, 1998 Guilhem Lavaux
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "http.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
30 #include "wx/string.h"
31 #include "wx/tokenzr.h"
32 #include "wx/socket.h"
33 #include "wx/protocol/protocol.h"
34 #include "wx/protocol/http.h"
35 #include "wx/sckstrm.h"
37 #if !USE_SHARED_LIBRARY
38 IMPLEMENT_DYNAMIC_CLASS(wxHTTP
, wxProtocol
)
39 IMPLEMENT_PROTOCOL(wxHTTP
, _T("http"), _T("80"), TRUE
)
42 #define HTTP_BSIZE 2048
46 m_headers(wxKEY_STRING
)
56 // wxString isn't a wxObject
57 wxNode
*node
= m_headers
.First();
61 string
= (wxString
*)node
->Data();
67 wxString
wxHTTP::GetContentType()
69 return GetHeader(_T("Content-Type"));
72 void wxHTTP::SetHeader(const wxString
& header
, const wxString
& h_data
)
79 wxNode
*node
= m_headers
.Find(header
);
82 m_headers
.Append(header
, (wxObject
*)(new wxString(h_data
)));
84 wxString
*str
= (wxString
*)node
->Data();
89 wxString
wxHTTP::GetHeader(const wxString
& header
)
91 wxNode
*node
= m_headers
.Find(header
);
95 return *((wxString
*)node
->Data());
98 void wxHTTP::SendHeaders()
100 wxNode
*head
= m_headers
.First();
104 wxString
*str
= (wxString
*)head
->Data();
107 buf
.Printf(_T("%s: %s\n\r"), head
->GetKeyString(), str
->GetData());
109 const wxWX2MBbuf cbuf
= buf
.mb_str();
110 Write(cbuf
, strlen(cbuf
));
116 bool wxHTTP::ParseHeaders()
124 m_error
= GetLine(this, line
);
125 if (m_error
!= wxPROTO_NOERR
)
128 if (line
.Length() == 0)
131 wxPrintf(_T("Header: %s\n"), WXSTRINGCAST line
);
132 int pos
= line
.Find(':');
136 wxString left_str
= line(0, pos
);
137 wxString right_str
= line(pos
+1, line
.Length());
139 right_str
= right_str
.Strip(wxString::leading
);
141 wxString
*str
= new wxString(right_str
);
143 m_headers
.Append(left_str
, (wxObject
*) str
);
148 bool wxHTTP::Connect(const wxString
& host
)
158 m_addr
= addr
= new wxIPV4address();
160 if (!addr
->Hostname(host
)) {
163 m_error
= wxPROTO_NETERR
;
167 if (!addr
->Service(_T("http")))
173 bool wxHTTP::Connect(wxSockAddress
& addr
, bool WXUNUSED(wait
))
175 struct sockaddr
*raw_addr
;
178 m_addr
= (wxSockAddress
*)(addr
.GetClassInfo()->CreateObject());
180 addr
.Build(raw_addr
, len
);
181 m_addr
->Disassemble(raw_addr
, len
);
186 bool wxHTTP::BuildRequest(const wxString
& path
, wxHTTP_Req req
)
189 char buf
[HTTP_BSIZE
];
190 const wxWX2MBbuf pathbuf
= path
.mb_str();
204 sprintf(buf
, "%s %s HTTP/1.0\n\r", tmp_buf
, (const char*)pathbuf
);
205 Write(buf
, strlen(buf
));
207 sprintf(buf
, "\n\r");
208 Write(buf
, strlen(buf
));
212 m_error
= GetLine(this, tmp_str
);
213 if (m_error
!= wxPROTO_NOERR
) {
218 if (!tmp_str
.Contains(_T("HTTP/"))) {
219 // TODO: support HTTP v0.9 which can have no header.
220 SetHeader(_T("Content-Length"), _T("-1"));
221 SetHeader(_T("Content-Type"), _T("none/none"));
226 wxStringTokenizer
token(tmp_str
,_T(' '));
231 tmp_str2
= token
.NextToken();
233 switch (wxAtoi(tmp_str2
)) {
237 m_error
= wxPROTO_NOFILE
;
242 ret_value
= ParseHeaders();
247 class wxHTTPStream
: public wxSocketInputStream
{
252 wxHTTPStream(wxHTTP
*http
) : wxSocketInputStream(*http
), m_http(http
) {}
253 size_t StreamSize() const { return m_httpsize
; }
254 virtual ~wxHTTPStream(void) { m_http
->Abort(); }
257 bool wxHTTP::Abort(void)
259 return wxSocketClient::Close();
262 wxInputStream
*wxHTTP::GetInputStream(const wxString
& path
)
264 wxHTTPStream
*inp_stream
= new wxHTTPStream(this);
266 if (!m_addr
|| m_connected
) {
267 m_error
= wxPROTO_CONNERR
;
271 if (!wxProtocol::Connect(*m_addr
))
274 if (!BuildRequest(path
, wxHTTP_GET
))
277 wxPrintf(_T("Len = %s\n"), WXSTRINGCAST
GetHeader(_T("Content-Length")));
278 if (!GetHeader(_T("Content-Length")).IsEmpty())
279 inp_stream
->m_httpsize
= wxAtoi(WXSTRINGCAST
GetHeader(_T("Content-Length")));