]> git.tdb.fi Git - libs/net.git/blobdiff - source/client.cpp
Convert svn:ignore to .gitignore
[libs/net.git] / source / client.cpp
index fde7c8d7bd20f48d10ea1f51dda748bb092249a9..be579184fa98e62a71d7ea3d09d5c247907fa16f 100644 (file)
@@ -15,14 +15,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 +35,10 @@ Client::~Client()
 
 void Client::use_event_dispatcher(IO::EventDispatcher *ed)
 {
+       if(event_disp && sock)
+               event_disp->remove(*sock);
        event_disp=ed;
-       if(sock)
+       if(event_disp && sock)
                event_disp->add(*sock);
 }
 
@@ -46,7 +47,10 @@ 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());
@@ -60,16 +64,19 @@ void Client::start_request(const Request &r)
        sock->connect(*addr);
 
        request=new Request(r);
+       if(!user_agent.empty())
+               request->set_header("User-Agent", user_agent);
 
        delete response;
        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()
@@ -80,7 +87,7 @@ void Client::tick()
        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);
 
@@ -93,7 +100,7 @@ void Client::tick()
 
 void Client::wait_response()
 {
-       while(!response || !response->get_complete())
+       while(request && (!response || !response->is_complete()))
                tick();
 }
 
@@ -130,16 +137,17 @@ void Client::data_available()
                if(in_buf.find("\r\n\r\n")!=string::npos || in_buf.find("\n\n")!=string::npos)
                {
                        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);