diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-11-11 23:49:03 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-11-11 23:49:03 +0000 |
commit | bedbe6480de4af64c0e752bc5ed09d0d7a9aa72c (patch) | |
tree | 281e7e2af14c04c1591d1312557cb57084aac16a | |
parent | 5252b3095f1329c547559ae66774227c4629e2c4 (diff) |
This works with multiple remote includes now except it hangs when an include is within an include
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8590 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r-- | src/configreader.cpp | 40 | ||||
-rw-r--r-- | src/inspsocket.cpp | 2 | ||||
-rw-r--r-- | src/modules/httpclient.h | 6 | ||||
-rw-r--r-- | src/modules/m_http_client.cpp | 50 | ||||
-rw-r--r-- | src/modules/m_remoteinclude.cpp | 6 | ||||
-rw-r--r-- | src/socketengines/socketengine_epoll.cpp | 2 |
6 files changed, 75 insertions, 31 deletions
diff --git a/src/configreader.cpp b/src/configreader.cpp index 993183b41..a72673363 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -1275,8 +1275,12 @@ void ServerConfig::Complete(const std::string &filename, bool error) /* We should parse the new file here and check it for another level of include files */ CompletedFiles[filename] = true; - LoadConf(this->newconfig, filename, errstr, 0, x->second); - StartDownloads(); + + if (!error) + { + LoadConf(this->newconfig, filename, errstr, 0, x->second); + StartDownloads(); + } } return; @@ -1284,11 +1288,14 @@ void ServerConfig::Complete(const std::string &filename, bool error) void ServerConfig::StartDownloads() { - if (isatty(0) && isatty(1) && isatty(2)) - printf("Downloading configuration "); + if (IncludedFiles.empty()) + { + if (isatty(0) && isatty(1) && isatty(2)) + printf("Downloading configuration "); - TotalDownloaded = 0; - FileErrors = 0; + TotalDownloaded = 0; + FileErrors = 0; + } /* Reads all local files into the IncludedFiles map, then initiates sockets for the remote ones */ for (std::map<std::string, std::istream*>::iterator x = IncludedFiles.begin(); x != IncludedFiles.end(); ++x) @@ -1435,7 +1442,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o if ((character_count++ < 2) && (ch == '\xFF' || ch == '\xFE')) { errorstream << "File " << filename << " cannot be read, as it is encoded in braindead UTF-16. Save your file as plain ASCII!" << std::endl; - delete conf; + if (!scan_for_includes_only) + delete conf; return false; } @@ -1491,7 +1499,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o else { errorstream << "End of file after a \\, what did you want to escape?: " << filename << ":" << linenumber << std::endl; - delete conf; + if (!scan_for_includes_only) + delete conf; return false; } } @@ -1506,7 +1515,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o if (!in_quote) { errorstream << "Got another opening < when the first one wasn't closed: " << filename << ":" << linenumber << std::endl; - delete conf; + if (!scan_for_includes_only) + delete conf; return false; } } @@ -1515,7 +1525,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o if (in_quote) { errorstream << "We're in a quote but outside a tag, interesting. " << filename << ":" << linenumber << std::endl; - delete conf; + if (!scan_for_includes_only) + delete conf; return false; } else @@ -1568,7 +1579,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o if (!this->ParseLine(target, line, linenumber, errorstream, pass, scan_for_includes_only)) { - delete conf; + if (!scan_for_includes_only) + delete conf; return false; } @@ -1577,7 +1589,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o else { errorstream << "Got a closing > when we weren't inside a tag: " << filename << ":" << linenumber << std::endl; - delete conf; + if (!scan_for_includes_only) + delete conf; return false; } } @@ -1591,7 +1604,8 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, const char* filename, std::o is a newline missing from the end of the file: " << filename << ":" << linenumber << std::endl; } - delete conf; + if (!scan_for_includes_only) + delete conf; return true; } diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index c5b6f1838..24f9af3a2 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -343,6 +343,8 @@ bool BufferedSocket::DoConnect() } this->SetQueues(this->fd); } + + Instance->Log(DEBUG,"BufferedSocket::DoConnect success"); return true; } diff --git a/src/modules/httpclient.h b/src/modules/httpclient.h index a89de4785..ed258c6af 100644 --- a/src/modules/httpclient.h +++ b/src/modules/httpclient.h @@ -133,6 +133,12 @@ class HTTPClientResponse : public Request str = responsestr; return response; } + + void SetResponse(const std::string &str) + { + responsestr = str; + response = atoi(responsestr.c_str()); + } std::string GetHeader(const std::string &header) { diff --git a/src/modules/m_http_client.cpp b/src/modules/m_http_client.cpp index 58ceb9e09..a25e014f6 100644 --- a/src/modules/m_http_client.cpp +++ b/src/modules/m_http_client.cpp @@ -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,7 +54,7 @@ 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"); orig = hostname; @@ -120,6 +121,8 @@ HTTPSocket::HTTPSocket(InspIRCd *Instance, ModuleHTTPClient *Mod) { Instance->Log(DEBUG,"HTTPSocket::HTTPSocket"); this->port = 80; + response = NULL; + closed = false; } HTTPSocket::~HTTPSocket() @@ -161,6 +164,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"); } else Connect(url.domain); @@ -170,7 +174,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 +257,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 @@ -288,7 +299,7 @@ bool HTTPSocket::OnDataReady() Instance->Log(DEBUG,"HTTPSocket::OnDataReady()"); char *data = this->Read(); - if (!data || !*data) + if (!data) return false; if (this->status < HTTP_DATA) @@ -314,7 +325,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 +350,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) diff --git a/src/modules/m_remoteinclude.cpp b/src/modules/m_remoteinclude.cpp index 3ad9b7ef2..d385e194e 100644 --- a/src/modules/m_remoteinclude.cpp +++ b/src/modules/m_remoteinclude.cpp @@ -94,8 +94,10 @@ class ModuleRemoteInclude : public Module { ServerInstance->Log(DEBUG,"Claiming schema http://, making fetch request"); - HTTPClientRequest req(ServerInstance, this, target, name); - req.Send(); + HTTPClientRequest* req = new HTTPClientRequest(ServerInstance, this, target, name); + req->Send(); + + /* XXX: We should delete req when the request is complete */ assoc[name] = new std::stringstream(); delete filedata; diff --git a/src/socketengines/socketengine_epoll.cpp b/src/socketengines/socketengine_epoll.cpp index fc806e10c..2068f33d2 100644 --- a/src/socketengines/socketengine_epoll.cpp +++ b/src/socketengines/socketengine_epoll.cpp @@ -121,6 +121,8 @@ int EPollEngine::DispatchEvents() int errcode; int i = epoll_wait(EngineHandle, events, MAX_DESCRIPTORS, 1000); + ServerInstance->Log(DEBUG,"Events: %d %d", i, CurrentSetSize); + for (int j = 0; j < i; j++) { if (events[j].events & EPOLLHUP) |