git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10509
e03df62e-2008-0410-955e-
edbf42e46eb7
socklen_t length;
/** Flushes the write buffer
socklen_t length;
/** Flushes the write buffer
+ * @returns true if the writing failed, false if it was successful
*/
bool FlushWriteBuffer();
*/
bool FlushWriteBuffer();
- /** 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
/**
* Bind to an address
* @param ip IP to bind to
/**
* When it is ok to write to the socket, and a
* write event was requested, this method is
/**
* 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
* 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
*/
* @return false to close the socket
*/
- virtual bool OnWriteReady();
/**
* When an outbound connection fails, and the
/**
* When an outbound connection fails, and the
bool BufferedSocket::Readable()
{
bool BufferedSocket::Readable()
{
- return ((this->state != I_CONNECTING) && (this->WaitingForWriteEvent == false));
+ return (this->state != I_CONNECTING);
}
BufferedSocket::BufferedSocket(InspIRCd* SI)
}
BufferedSocket::BufferedSocket(InspIRCd* SI)
this->Timeout = NULL;
this->state = I_DISCONNECTED;
this->fd = -1;
this->Timeout = NULL;
this->state = I_DISCONNECTED;
this->fd = -1;
- this->WaitingForWriteEvent = false;
this->fd = newfd;
this->state = I_CONNECTED;
strlcpy(this->IP,ip,MAXBUF);
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);
this->Instance = SI;
if (this->fd > -1)
this->Instance->SE->AddFd(this);
this->fd = -1;
this->Instance = SI;
strlcpy(host,ipaddr.c_str(),MAXBUF);
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);
this->Timeout = NULL;
strlcpy(this->host,ipaddr.c_str(),MAXBUF);
void BufferedSocket::WantWrite()
{
this->Instance->SE->WantWrite(this);
void BufferedSocket::WantWrite()
{
this->Instance->SE->WantWrite(this);
- this->WaitingForWriteEvent = true;
}
void BufferedSocket::SetQueues(int nfd)
}
void BufferedSocket::SetQueues(int nfd)
void BufferedSocket::OnError(BufferedSocketError) { return; }
int BufferedSocket::OnDisconnect() { return 0; }
bool BufferedSocket::OnDataReady() { 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; }
void BufferedSocket::OnTimeout() { return; }
void BufferedSocket::OnClose() { return; }
}
break;
case EVENT_WRITE:
}
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
if (this->state == I_CONNECTING)
{
/* This might look wrong as if we should be actually calling
- if (this->FlushWriteBuffer())
+ if (!this->OnWriteReady())
{
if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end())
this->Instance->SocketCull[this] = this;
{
if (this->Instance->SocketCull.find(this) == this->Instance->SocketCull.end())
this->Instance->SocketCull[this] = this;
SendHeaders(data.length(), response, empty);
this->Write(data);
SendHeaders(data.length(), response, empty);
this->Write(data);
- this->FlushWriteBuffer();
}
void SendHeaders(unsigned long size, int response, HTTPHeaders &rheaders)
}
void SendHeaders(unsigned long size, int response, HTTPHeaders &rheaders)
if (request_type.empty() || uri.empty() || http_version.empty())
{
SendHTTPError(400);
if (request_type.empty() || uri.empty() || http_version.empty())
{
SendHTTPError(400);
if ((fieldsep == std::string::npos) || (fieldsep == 0) || (fieldsep == cheader.length() - 1))
{
SendHTTPError(400);
if ((fieldsep == std::string::npos) || (fieldsep == 0) || (fieldsep == cheader.length() - 1))
{
SendHTTPError(400);
if ((http_version != "HTTP/1.1") && (http_version != "HTTP/1.0"))
{
SendHTTPError(505);
if ((http_version != "HTTP/1.1") && (http_version != "HTTP/1.0"))
{
SendHTTPError(505);
HTTPHeaders empty;
SendHeaders(index->ContentSize(), 200, empty);
this->Write(index->Contents());
HTTPHeaders empty;
SendHeaders(index->ContentSize(), 200, empty);
this->Write(index->Contents());
- this->FlushWriteBuffer();
- SetWrite();
if (!claimed)
{
SendHTTPError(404);
if (!claimed)
{
SendHTTPError(404);
-
- 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());
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);