summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/inspsocket.h25
-rw-r--r--src/inspsocket.cpp24
-rw-r--r--src/modules/m_httpd.cpp23
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);
}
};