X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fclient.cpp;h=6801ad2a3fc73cae566170577ad03b20f0182dc3;hb=c3bc44e20b80683ec1e8296a449804ff6c5f7aff;hp=fde7c8d7bd20f48d10ea1f51dda748bb092249a9;hpb=070d56e7b0036ca2e4234eb06dcae83ebfb3df34;p=libs%2Fnet.git diff --git a/source/client.cpp b/source/client.cpp index fde7c8d..6801ad2 100644 --- a/source/client.cpp +++ b/source/client.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of libmsphttp -Copyright © 2008 Mikkosoft Productions, Mikko Rasa -Distributed under the LGPL -*/ - #include #include #include @@ -15,14 +8,13 @@ Distributed under the LGPL using namespace std; -#include - namespace Msp { namespace Http { Client::Client(): sock(0), event_disp(0), + user_agent("libmsphttp/0.1"), request(0), response(0) { } @@ -36,8 +28,10 @@ Client::~Client() void Client::use_event_dispatcher(IO::EventDispatcher *ed) { - event_disp=ed; - if(sock) + if(event_disp && sock) + event_disp->remove(*sock); + event_disp = ed; + if(event_disp && sock) event_disp->add(*sock); } @@ -46,10 +40,13 @@ void Client::start_request(const Request &r) if(request) throw InvalidState("Already processing a request"); - RefPtr addr=Net::resolve(r.get_header("host")+":"+r.get_header("x-port")); + string host = r.get_header("Host"); + if(host.find(':')==string::npos) + host += ":80"; + RefPtr addr = Net::resolve(host); delete sock; - sock=new Net::StreamSocket(addr->get_family()); + sock = new Net::StreamSocket(addr->get_family()); sock->set_block(false); sock->signal_data_available.connect(sigc::mem_fun(this, &Client::data_available)); @@ -59,17 +56,20 @@ void Client::start_request(const Request &r) sock->connect(*addr); - request=new Request(r); + request = new Request(r); + if(!user_agent.empty()) + request->set_header("User-Agent", user_agent); delete response; - response=0; + response = 0; in_buf.clear(); } -void Client::get_url(const std::string &url) +const Response *Client::get_url(const std::string &url) { start_request(Request::from_url(url)); wait_response(); + return response; } void Client::tick() @@ -77,32 +77,32 @@ void Client::tick() if(!request) return; - while(IO::PollEvent ev=IO::poll(*sock, sock->get_events(), Time::zero)) + while(IO::PollEvent ev = IO::poll(*sock, sock->get_events(), Time::zero)) sock->event(ev); - if(response && response->get_complete()) + if(response && response->is_complete()) { signal_response_complete.emit(*response); delete sock; - sock=0; + sock = 0; delete request; - request=0; + request = 0; } } void Client::wait_response() { - while(!response || !response->get_complete()) + while(request && (!response || !response->is_complete())) tick(); } void Client::abort() { delete sock; - sock=0; + sock = 0; delete request; - request=0; + request = 0; } void Client::connect_finished(int err) @@ -113,7 +113,7 @@ void Client::connect_finished(int err) sock->close(); delete request; - request=0; + request = 0; } else sock->write(request->str()); @@ -122,30 +122,31 @@ void Client::connect_finished(int err) void Client::data_available() { char rbuf[4096]; - unsigned len=sock->read(rbuf, sizeof(rbuf)); + unsigned len = sock->read(rbuf, sizeof(rbuf)); in_buf.append(rbuf, len); if(!response) { if(in_buf.find("\r\n\r\n")!=string::npos || in_buf.find("\n\n")!=string::npos) { - response=new Response(Response::parse(in_buf)); - in_buf=string(); + response = new Response(Response::parse(in_buf)); + response->set_user_data(request->get_user_data()); + in_buf = string(); } } else { - len=response->parse_data(in_buf); + len = response->parse_content(in_buf); in_buf.erase(0, len); } - if(response && response->get_complete()) + if(response && response->is_complete()) { signal_response_complete.emit(*response); sock->close(); delete request; - request=0; + request = 0; } }