]> git.tdb.fi Git - libs/net.git/blobdiff - source/client.cpp
Drop Id tags and copyright notices from source files
[libs/net.git] / source / client.cpp
index fde7c8d7bd20f48d10ea1f51dda748bb092249a9..6801ad2a3fc73cae566170577ad03b20f0182dc3 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of libmsphttp
-Copyright © 2008  Mikkosoft Productions, Mikko Rasa
-Distributed under the LGPL
-*/
-
 #include <msp/core/except.h>
 #include <msp/core/refptr.h>
 #include <msp/net/resolve.h>
@@ -15,14 +8,13 @@ Distributed under the LGPL
 
 using namespace std;
 
-#include <iostream>
-
 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<Net::SockAddr> 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<Net::SockAddr> 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;
        }
 }