diff options
-rw-r--r-- | include/inspsocket.h | 25 | ||||
-rw-r--r-- | src/inspsocket.cpp | 24 | ||||
-rw-r--r-- | src/modules/m_httpd.cpp | 23 |
3 files changed, 22 insertions, 50 deletions
diff --git a/include/inspsocket.h b/include/inspsocket.h index f61bf133d..c3b24ad8f 100644 --- a/include/inspsocket.h +++ b/include/inspsocket.h @@ -159,6 +159,7 @@ class CoreExport BufferedSocket : public EventHandler socklen_t length; /** Flushes the write buffer + * @returns true if the writing failed, false if it was successful */ bool FlushWriteBuffer(); @@ -176,12 +177,6 @@ class CoreExport BufferedSocket : public EventHandler */ bool ClosePending; - /** Set to true when we're waiting for a write event. - * If this is true and a write event comes in, we - * call the write instead of the read method. - */ - bool WaitingForWriteEvent; - /** * Bind to an address * @param ip IP to bind to @@ -256,13 +251,23 @@ class CoreExport BufferedSocket : public EventHandler /** * When it is ok to write to the socket, and a * write event was requested, this method is - * triggered. Within this method you should call + * triggered. + * + * Within this method you should call * write() or send() etc, to send data to the - * other end of the socket. Further write events - * will not be triggered unless you call WantWrite(). + * other end of the socket. + * + * Further write events will not be triggered + * unless you call WantWrite(). + * + * The default behaviour of this method is to + * flush the write buffer, respecting the IO + * hooking modules. + * + * XXX: this used to be virtual, ask us if you need it to be so. * @return false to close the socket */ - virtual bool OnWriteReady(); + bool OnWriteReady(); /** * When an outbound connection fails, and the diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 0c3f3ea17..ea0534f24 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -20,7 +20,7 @@ bool BufferedSocket::Readable() { - return ((this->state != I_CONNECTING) && (this->WaitingForWriteEvent == false)); + return (this->state != I_CONNECTING); } BufferedSocket::BufferedSocket(InspIRCd* SI) @@ -28,7 +28,6 @@ BufferedSocket::BufferedSocket(InspIRCd* SI) this->Timeout = NULL; this->state = I_DISCONNECTED; this->fd = -1; - this->WaitingForWriteEvent = false; this->Instance = SI; } @@ -38,7 +37,6 @@ BufferedSocket::BufferedSocket(InspIRCd* SI, int newfd, const char* ip) this->fd = newfd; this->state = I_CONNECTED; strlcpy(this->IP,ip,MAXBUF); - this->WaitingForWriteEvent = false; this->Instance = SI; if (this->fd > -1) this->Instance->SE->AddFd(this); @@ -50,7 +48,6 @@ BufferedSocket::BufferedSocket(InspIRCd* SI, const std::string &ipaddr, int apor this->fd = -1; this->Instance = SI; strlcpy(host,ipaddr.c_str(),MAXBUF); - this->WaitingForWriteEvent = false; this->Timeout = NULL; strlcpy(this->host,ipaddr.c_str(),MAXBUF); @@ -98,7 +95,6 @@ BufferedSocket::BufferedSocket(InspIRCd* SI, const std::string &ipaddr, int apor void BufferedSocket::WantWrite() { this->Instance->SE->WantWrite(this); - this->WaitingForWriteEvent = true; } void BufferedSocket::SetQueues(int nfd) @@ -595,7 +591,11 @@ bool BufferedSocket::OnConnected() { return true; } void BufferedSocket::OnError(BufferedSocketError) { return; } int BufferedSocket::OnDisconnect() { return 0; } bool BufferedSocket::OnDataReady() { return true; } -bool BufferedSocket::OnWriteReady() { return true; } +bool BufferedSocket::OnWriteReady() +{ + // Default behaviour: just try write some. + return !this->FlushWriteBuffer(); +} void BufferedSocket::OnTimeout() { return; } void BufferedSocket::OnClose() { return; } @@ -644,16 +644,6 @@ void BufferedSocket::HandleEvent(EventType et, int errornum) } break; case EVENT_WRITE: - if (this->WaitingForWriteEvent) - { - this->WaitingForWriteEvent = false; - if (!this->OnWriteReady()) - { - if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end()) - this->Instance->SocketCull[this] = this; - return; - } - } if (this->state == I_CONNECTING) { /* This might look wrong as if we should be actually calling @@ -667,7 +657,7 @@ void BufferedSocket::HandleEvent(EventType et, int errornum) } else { - if (this->FlushWriteBuffer()) + if (!this->OnWriteReady()) { if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end()) this->Instance->SocketCull[this] = this; diff --git a/src/modules/m_httpd.cpp b/src/modules/m_httpd.cpp index 777ba5567..eaf671267 100644 --- a/src/modules/m_httpd.cpp +++ b/src/modules/m_httpd.cpp @@ -165,7 +165,6 @@ class HttpServerSocket : public BufferedSocket SendHeaders(data.length(), response, empty); this->Write(data); - this->FlushWriteBuffer(); } void SendHeaders(unsigned long size, int response, HTTPHeaders &rheaders) @@ -251,7 +250,6 @@ class HttpServerSocket : public BufferedSocket if (request_type.empty() || uri.empty() || http_version.empty()) { SendHTTPError(400); - SetWrite(); return; } @@ -265,7 +263,6 @@ class HttpServerSocket : public BufferedSocket if ((fieldsep == std::string::npos) || (fieldsep == 0) || (fieldsep == cheader.length() - 1)) { SendHTTPError(400); - SetWrite(); return; } @@ -282,7 +279,6 @@ class HttpServerSocket : public BufferedSocket if ((http_version != "HTTP/1.1") && (http_version != "HTTP/1.0")) { SendHTTPError(505); - SetWrite(); return; } @@ -319,8 +315,6 @@ class HttpServerSocket : public BufferedSocket HTTPHeaders empty; SendHeaders(index->ContentSize(), 200, empty); this->Write(index->Contents()); - this->FlushWriteBuffer(); - SetWrite(); } else { @@ -335,32 +329,15 @@ class HttpServerSocket : public BufferedSocket if (!claimed) { SendHTTPError(404); - SetWrite(); } } } } - - bool OnWriteReady() - { - Instance->Logs->Log("m_httpd",DEBUG,"OnWriteReady()"); - return false; - } - void Page(std::stringstream* n, int response, HTTPHeaders *hheaders) { SendHeaders(n->str().length(), response, *hheaders); this->Write(n->str()); - this->FlushWriteBuffer(); - SetWrite(); - } - - void SetWrite() - { - Instance->Logs->Log("m_httpd",DEBUG,"SetWrite()"); - this->WaitingForWriteEvent = true; - Instance->SE->WantWrite(this); } }; |