summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dns.cpp2
-rw-r--r--src/modules/httpclient.h21
-rw-r--r--src/modules/m_http_client.cpp29
-rw-r--r--src/modules/m_remoteinclude.cpp15
4 files changed, 53 insertions, 14 deletions
diff --git a/src/dns.cpp b/src/dns.cpp
index 1918053b5..8a274577e 100644
--- a/src/dns.cpp
+++ b/src/dns.cpp
@@ -338,8 +338,6 @@ void DNS::Rehash()
this->ip6munge = true;
}
- printf("dns server: %s\n", ServerInstance->Config->DNSServer);
-
this->socketfamily = AF_INET;
#ifdef IPV6
if (strchr(ServerInstance->Config->DNSServer,':'))
diff --git a/src/modules/httpclient.h b/src/modules/httpclient.h
index c5e84261f..a89de4785 100644
--- a/src/modules/httpclient.h
+++ b/src/modules/httpclient.h
@@ -23,6 +23,7 @@ typedef std::map<std::string,std::string> HeaderMap;
const char* HTTP_CLIENT_RESPONSE = "HTTPCLIENT_RESPONSE";
const char* HTTP_CLIENT_REQUEST = "HTTPCLIENT_REQUEST";
+const char* HTTP_CLIENT_ERROR = "HTTPCLIENT_ERROR";
/** This class represents an outgoing HTTP request
*/
@@ -67,6 +68,26 @@ class HTTPClientRequest : public Request
}
};
+class HTTPClientError : public Request
+{
+ protected:
+ friend class HTTPSocket;
+ std::string url;
+ int response;
+ std::string responsestr;
+ HeaderMap Headers;
+ public:
+ HTTPClientError(Module* src, Module* target, const std::string &url, int response)
+ : Request(src, target, HTTP_CLIENT_ERROR), url(url), response(response)
+ {
+ }
+
+ const std::string &GetURL()
+ {
+ return url;
+ }
+};
+
class HTTPClientResponse : public Request
{
protected:
diff --git a/src/modules/m_http_client.cpp b/src/modules/m_http_client.cpp
index 6a72d4eee..0c7ec509a 100644
--- a/src/modules/m_http_client.cpp
+++ b/src/modules/m_http_client.cpp
@@ -70,8 +70,7 @@ class HTTPResolver : public Resolver
void OnError(ResolverError e, const string &errmsg)
{
ServerInstance->Log(DEBUG,"HTTPResolver::OnError");
- /*if (ServerInstance->SocketCull.find(socket) == ServerInstance->SocketCull.end())
- ServerInstance->SocketCull[socket] = socket;*/
+ socket->OnClose();
}
};
@@ -150,13 +149,17 @@ bool HTTPSocket::DoRequest(HTTPClientRequest *req)
this->port = url.port;
strlcpy(this->host, url.domain.c_str(), MAXBUF);
- /*
- bool cached;
- HTTPResolver* r = new HTTPResolver(this, Server, url.domain, cached, (Module*)Mod);
- Instance->AddResolver(r, cached);
- return true;
- */
- Connect(url.domain);
+ in6_addr s6;
+ in_addr s4;
+ /* Doesnt look like an ipv4 or an ipv6 address */
+ if ((inet_pton(AF_INET6, url.domain.c_str(), &s6) < 1) && (inet_pton(AF_INET, url.domain.c_str(), &s4) < 1))
+ {
+ bool cached;
+ HTTPResolver* r = new HTTPResolver(this, Server, url.domain, cached, (Module*)Mod);
+ Instance->AddResolver(r, cached);
+ }
+ else
+ Connect(url.domain);
return true;
}
@@ -334,8 +337,14 @@ void HTTPSocket::OnClose()
{
Instance->Log(DEBUG,"HTTPSocket::OnClose");
if (data.empty())
- return; // notification that request failed?
+ {
+ 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;
diff --git a/src/modules/m_remoteinclude.cpp b/src/modules/m_remoteinclude.cpp
index ca0d7af72..7e6ba8df3 100644
--- a/src/modules/m_remoteinclude.cpp
+++ b/src/modules/m_remoteinclude.cpp
@@ -42,9 +42,9 @@ class ModuleRemoteInclude : public Module
char* OnRequest(Request* req)
{
- HTTPClientResponse* resp = (HTTPClientResponse*)req;
- if(!strcmp(resp->GetId(), HTTP_CLIENT_RESPONSE))
+ if (!strcmp(req->GetId(), HTTP_CLIENT_RESPONSE))
{
+ HTTPClientResponse* resp = (HTTPClientResponse*)req;
ServerInstance->Log(DEBUG, "Got http file for %s", resp->GetURL().c_str());
std::map<std::string, std::stringstream*>::iterator n = assoc.find(resp->GetURL());
@@ -64,7 +64,18 @@ class ModuleRemoteInclude : public Module
*/
assoc.erase(n);
}
+ else if (!strcmp(req->GetId(), HTTP_CLIENT_ERROR))
+ {
+ HTTPClientError* resp = (HTTPClientError*)req;
+
+ ServerInstance->Log(DEBUG, "Got http error when accessing %s", resp->GetURL().c_str());
+ ServerInstance->Config->Complete(resp->GetURL(), true);
+ std::map<std::string, std::stringstream*>::iterator n = assoc.find(resp->GetURL());
+
+ if (n != assoc.end())
+ assoc.erase(n);
+ }
return NULL;
}