3 This file is part of libmsphttp
4 Copyright © 2008 Mikkosoft Productions, Mikko Rasa
5 Distributed under the LGPL
8 #include <msp/core/except.h>
9 #include <msp/core/refptr.h>
10 #include <msp/net/resolve.h>
11 #include <msp/time/units.h>
37 void Client::use_event_dispatcher(IO::EventDispatcher *ed)
39 if(event_disp && sock)
40 event_disp->remove(*sock);
42 if(event_disp && sock)
43 event_disp->add(*sock);
46 void Client::start_request(const Request &r)
49 throw InvalidState("Already processing a request");
51 RefPtr<Net::SockAddr> addr=Net::resolve(r.get_header("host")+":"+r.get_header("x-port"));
54 sock=new Net::StreamSocket(addr->get_family());
55 sock->set_block(false);
57 sock->signal_data_available.connect(sigc::mem_fun(this, &Client::data_available));
58 sock->signal_connect_finished.connect(sigc::mem_fun(this, &Client::connect_finished));
60 event_disp->add(*sock);
64 request=new Request(r);
71 const Response *Client::get_url(const std::string &url)
73 start_request(Request::from_url(url));
83 while(IO::PollEvent ev=IO::poll(*sock, sock->get_events(), Time::zero))
86 if(response && response->get_complete())
88 signal_response_complete.emit(*response);
97 void Client::wait_response()
99 while(!response || !response->get_complete())
111 void Client::connect_finished(int err)
115 signal_socket_error.emit(err);
122 sock->write(request->str());
125 void Client::data_available()
128 unsigned len=sock->read(rbuf, sizeof(rbuf));
129 in_buf.append(rbuf, len);
133 if(in_buf.find("\r\n\r\n")!=string::npos || in_buf.find("\n\n")!=string::npos)
135 response=new Response(Response::parse(in_buf));
136 response->set_user_data(request->get_user_data());
142 len=response->parse_content(in_buf);
143 in_buf.erase(0, len);
146 if(response && response->get_complete())
148 signal_response_complete.emit(*response);