mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 14:16:09 -06:00
.Web: fixed two bugs concerning delayed writes in HttpServer: a) unnecessary blocking waits after sending the data; b) incorrect graceful shutdown sequence
git-svn-id: svn://ultimatepp.org/upp/trunk@3415 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
73c42516fd
commit
0531457aab
1 changed files with 29 additions and 10 deletions
|
|
@ -278,13 +278,36 @@ void HttpServer::Close()
|
|||
|
||||
bool HttpServer::DelayedWrite()
|
||||
{
|
||||
static const int MAX_SEND_CHUNK = 65536;
|
||||
// if(!delayed_writes.IsEmpty())
|
||||
// LogTime("HttpServer::DelayedWrite, #writes = " + FormatInt(delayed_writes.GetCount()), 2);
|
||||
for(int i = delayed_writes.GetCount(); --i >= 0;) {
|
||||
SocketWrite& sw = delayed_writes[i];
|
||||
if(IsNull(sw.data)) {
|
||||
sw.socket.ReadCount(1, 0);
|
||||
bool rm = sw.socket.IsEof();
|
||||
if(!rm && sw.socket.IsError()) {
|
||||
LogTime("HttpServer::DelayedWrite: shutdown error: " + sw.socket.GetErrorText(), 0);
|
||||
rm = true;
|
||||
}
|
||||
if(!rm && msecs(sw.ticks) >= max_request_time) {
|
||||
LogTime("HttpServer::DelayedWrite: timed out waiting for socket shutdown", 0);
|
||||
rm = true;
|
||||
}
|
||||
if(rm) {
|
||||
sw.socket.Close();
|
||||
delayed_writes.Remove(i);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// int part = sw.data.GetLength() - sw.done; Mirek:unused
|
||||
int count = max(sw.socket.WriteWait(sw.data.Begin() + sw.done, sw.data.GetLength() - sw.done, 0), 0);
|
||||
int count = max(sw.socket.WriteWait(sw.data.Begin() + sw.done,
|
||||
min(sw.data.GetLength() - sw.done, MAX_SEND_CHUNK), 0), 0);
|
||||
if(sw.socket.IsError()) {
|
||||
if(sw.socket.GetErrorCode() == SOCKERR(ENOBUFS)) {
|
||||
sw.socket.ClearError();
|
||||
continue;
|
||||
}
|
||||
LogTime(NFormat("HttpServer::DelayedWrite(): %s", Socket::GetErrorText()), 0);
|
||||
delayed_writes.Remove(i);
|
||||
continue;
|
||||
|
|
@ -294,18 +317,14 @@ bool HttpServer::DelayedWrite()
|
|||
if((sw.done += count) >= sw.data.GetLength()) {
|
||||
LogTime(NFormat("HttpServer::DelayedWrite(): finished %d (%d left)",
|
||||
sw.socket.GetNumber(), delayed_writes.GetCount() - 1), 2);
|
||||
// sw.socket.Block(); // set to blocking mode before close
|
||||
sw.socket.PeekWrite(1000);
|
||||
sw.ticks = msecs();
|
||||
sw.data = Null;
|
||||
sw.socket.StopWrite();
|
||||
sw.socket.Close();
|
||||
// sw.socket.StopWrite();
|
||||
delayed_writes.Remove(i);
|
||||
}
|
||||
else if(msecs(sw.ticks) >= max_request_time) {
|
||||
LogTime(NFormat("HttpServer::DelayedWrite(): timeout after sending %d out of %d bytes",
|
||||
LogTime(NFormat("HttpServer::DelayedWrite(): timed out after sending %d out of %d bytes",
|
||||
sw.done, sw.data.GetLength()), 0);
|
||||
// sw.socket.Block(); // set to blocking mode before close
|
||||
sw.socket.StopWrite();
|
||||
// sw.socket.StopWrite();
|
||||
sw.socket.Close();
|
||||
delayed_writes.Remove(i);
|
||||
}
|
||||
|
|
@ -851,7 +870,7 @@ String GetHttpURI(HttpQuery query)
|
|||
void GetHttpPostData(HttpQuery& query, String buffer)
|
||||
{
|
||||
query.Set("$$POSTDATA", buffer);
|
||||
|
||||
|
||||
const char *p = buffer;
|
||||
while(p[0] != '-' || p[1] != '-') {
|
||||
while(*p != '\n')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue