1 #include <msp/core/refptr.h>
2 #include <msp/net/resolve.h>
3 #include <msp/time/timedelta.h>
19 user_agent("libmsphttp/0.1"),
31 void Client::use_event_dispatcher(IO::EventDispatcher *ed)
33 if(event_disp && sock)
34 event_disp->remove(*sock);
36 if(event_disp && sock)
37 event_disp->add(*sock);
40 void Client::use_resolver(Net::Resolver *r)
44 delete resolve_listener;
50 resolve_listener = new ResolveListener(*this);
53 void Client::start_request(const Request &r)
61 request = new Request(r);
62 if(!user_agent.empty())
63 request->set_header("User-Agent", user_agent);
69 string host = r.get_header("Host");
70 if(host.find(':')==string::npos)
73 resolve_tag = resolver->resolve(host);
76 RefPtr<Net::SockAddr> addr = Net::resolve(host);
77 address_resolved(resolve_tag, *addr);
81 const Response *Client::get_url(const std::string &url)
83 start_request(Request::from_url(url));
93 while(IO::PollEvent ev = IO::poll(*sock, sock->get_events(), Time::zero))
96 if(response && response->is_complete())
98 signal_response_complete.emit(*response);
107 void Client::wait_response()
109 while(request && (!response || !response->is_complete()))
121 void Client::address_resolved(unsigned tag, const Net::SockAddr &addr)
127 sock = new Net::StreamSocket(addr.get_family());
128 sock->set_block(false);
130 sock->signal_data_available.connect(sigc::mem_fun(this, &Client::data_available));
131 sock->signal_connect_finished.connect(sigc::mem_fun(this, &Client::connect_finished));
133 event_disp->add(*sock);
138 void Client::resolve_failed(unsigned tag, const exception &err)
144 signal_socket_error.emit(err);
150 void Client::connect_finished(const exception *err)
154 signal_socket_error.emit(*err);
160 sock->write(request->str());
163 void Client::data_available()
169 len = sock->read(rbuf, sizeof(rbuf));
171 catch(const exception &e)
173 signal_socket_error.emit(e);
179 in_buf.append(rbuf, len);
183 if(in_buf.find("\r\n\r\n")!=string::npos || in_buf.find("\n\n")!=string::npos)
185 response = new Response(Response::parse(in_buf));
186 response->set_user_data(request->get_user_data());
192 len = response->parse_content(in_buf);
193 in_buf.erase(0, len);
196 if(response && response->is_complete())
198 signal_response_complete.emit(*response);
206 Client::ResolveListener::ResolveListener(Client &c):
209 client.resolver->signal_address_resolved.connect(sigc::mem_fun(this, &ResolveListener::address_resolved));
210 client.resolver->signal_resolve_failed.connect(sigc::mem_fun(this, &ResolveListener::resolve_failed));
213 void Client::ResolveListener::address_resolved(unsigned tag, const Net::SockAddr &addr)
215 client.address_resolved(tag, addr);
218 void Client::ResolveListener::resolve_failed(unsigned tag, const exception &err)
220 client.resolve_failed(tag, err);