X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_http_client.cpp;h=a2a6d9014db8fe4199df4a4a79be3b942796c2da;hb=e4acbc95b8b6cd5b28d38a2242c02e8ff4991e4a;hp=58ceb9e093c963fe44d4343738c326dacf8f7fbd;hpb=5252b3095f1329c547559ae66774227c4629e2c4;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_http_client.cpp b/src/modules/m_http_client.cpp index 58ceb9e09..a2a6d9014 100644 --- a/src/modules/m_http_client.cpp +++ b/src/modules/m_http_client.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team + * InspIRCd: (C) 2002-2008 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -35,6 +35,7 @@ class HTTPSocket : public BufferedSocket enum { HTTP_CLOSED, HTTP_REQSENT, HTTP_HEADERS, HTTP_DATA } status; std::string data; std::string buffer; + bool closed; public: HTTPSocket(InspIRCd *Instance, class ModuleHTTPClient *Mod); @@ -53,15 +54,15 @@ class HTTPResolver : public Resolver HTTPSocket *socket; std::string orig; public: - HTTPResolver(HTTPSocket *socket, InspIRCd *Instance, const string &hostname, bool &cached, Module* me) : Resolver(Instance, hostname, DNS_QUERY_FORWARD, cached, me), socket(socket) + HTTPResolver(HTTPSocket *s, InspIRCd *Instance, const string &hostname, bool &cached, Module* me) : Resolver(Instance, hostname, DNS_QUERY_FORWARD, cached, me), socket(s) { - ServerInstance->Log(DEBUG,"HTTPResolver::HTTPResolver"); + ServerInstance->Log(DEBUG,">>>>>>>>>>>>>>>>>> HTTPResolver::HTTPResolver <<<<<<<<<<<<<<<"); orig = hostname; } void OnLookupComplete(const string &result, unsigned int ttl, bool cached, int resultnum = 0) { - ServerInstance->Log(DEBUG,"HTTPResolver::OnLookupComplete"); + ServerInstance->Log(DEBUG,"************* HTTPResolver::OnLookupComplete ***************"); if (!resultnum) socket->Connect(result); else @@ -70,7 +71,7 @@ class HTTPResolver : public Resolver void OnError(ResolverError e, const string &errmsg) { - ServerInstance->Log(DEBUG,"HTTPResolver::OnError"); + ServerInstance->Log(DEBUG,"!!!!!!!!!!!!!!!! HTTPResolver::OnError: %s", errmsg.c_str()); socket->OnClose(); } }; @@ -120,6 +121,9 @@ HTTPSocket::HTTPSocket(InspIRCd *Instance, ModuleHTTPClient *Mod) { Instance->Log(DEBUG,"HTTPSocket::HTTPSocket"); this->port = 80; + response = NULL; + closed = false; + timeout_val = 10; } HTTPSocket::~HTTPSocket() @@ -161,6 +165,7 @@ bool HTTPSocket::DoRequest(HTTPClientRequest *req) bool cached; HTTPResolver* r = new HTTPResolver(this, Server, url.domain, cached, (Module*)Mod); Instance->AddResolver(r, cached); + Instance->Log(DEBUG,"Resolver added, cached=%d", cached); } else Connect(url.domain); @@ -170,7 +175,7 @@ bool HTTPSocket::DoRequest(HTTPClientRequest *req) bool HTTPSocket::ParseURL(const std::string &iurl) { - Instance->Log(DEBUG,"HTTPSocket::ParseURL"); + Instance->Log(DEBUG,"HTTPSocket::ParseURL %s", iurl.c_str()); url.url = iurl; url.port = 80; url.protocol = "http"; @@ -253,16 +258,23 @@ bool HTTPSocket::ParseURL(const std::string &iurl) void HTTPSocket::Connect(const string &ip) { - Instance->Log(DEBUG,"HTTPSocket::Connect(%s)", ip.c_str()); + this->response = new HTTPClientResponse((Module*)Mod, req.GetSource() , url.url, 0, ""); + + Instance->Log(DEBUG,"HTTPSocket::Connect(%s) response=%08lx", ip.c_str(), response); strlcpy(this->IP, ip.c_str(), MAXBUF); strlcpy(this->host, ip.c_str(), MAXBUF); if (!this->DoConnect()) + { + Instance->Log(DEBUG,"DoConnect failed, bailing"); this->Close(); + } } bool HTTPSocket::OnConnected() { + Instance->Log(DEBUG,"HTTPSocket::OnConnected"); + std::string request = "GET " + url.request + " HTTP/1.1\r\n"; // Dump headers into the request @@ -285,10 +297,10 @@ bool HTTPSocket::OnConnected() bool HTTPSocket::OnDataReady() { - Instance->Log(DEBUG,"HTTPSocket::OnDataReady()"); + Instance->Log(DEBUG,"HTTPSocket::OnDataReady() for %s", url.url.c_str()); char *data = this->Read(); - if (!data || !*data) + if (!data) return false; if (this->status < HTTP_DATA) @@ -314,7 +326,8 @@ bool HTTPSocket::OnDataReady() // HTTP reply (HTTP/1.1 200 msg) char const* data = line.c_str(); data += 9; - response = new HTTPClientResponse((Module*)Mod, req.GetSource() , url.url, atoi(data), data + 4); + response->SetResponse(data); + response->SetData(data + 4); this->status = HTTP_HEADERS; continue; } @@ -338,19 +351,25 @@ bool HTTPSocket::OnDataReady() void HTTPSocket::OnClose() { - Instance->Log(DEBUG,"HTTPSocket::OnClose"); - if (data.empty()) + if (!closed) { - HTTPClientError* err = new HTTPClientError((Module*)Mod, req.GetSource(), req.GetURL(), 0); - err->Send(); - delete err; - return; - } + closed = true; + Instance->Log(DEBUG,"HTTPSocket::OnClose response=%08lx", response); + std::string e; + if (data.empty()) + { + Instance->Log(DEBUG,"Send error"); + HTTPClientError* err = new HTTPClientError((Module*)Mod, req.GetSource(), req.GetURL(), 0); + err->Send(); + delete err; + return; + } - Instance->Log(DEBUG,"Set data and send"); - response->data = data; - response->Send(); - delete response; + Instance->Log(DEBUG,"Set data and send, %s", response->GetURL().c_str()); + response->SetData(data); + response->Send(); + delete response; + } } MODULE_INIT(ModuleHTTPClient)