Move the HTTP timeout into C where we can manage it better as writes are active. Fixes an accidental 45 second GET timeout from httpd.js.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4466 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
2023-09-20 23:30:29 +00:00
parent 47532b8512
commit e1383e3903
2 changed files with 71 additions and 39 deletions

View File

@ -4,7 +4,7 @@ let gHandlers = [];
let gSocketHandlers = [];
let gBadRequests = {};
const kRequestTimeout = 15000;
const kRequestTimeout = 5000;
const kStallTimeout = 60000;
function logError(error) {
@ -395,41 +395,10 @@ function handleConnection(client) {
let parsing_header = true;
let bodyToRead = -1;
let body;
let requestCount = -1;
let readCount = 0;
let isWebsocket = false;
function resetTimeout(requestIndex) {
if (isWebsocket) {
return;
}
if (bodyToRead == -1) {
setTimeout(function() {
if (requestCount == requestIndex) {
client.info = 'timed out';
if (requestCount == 0) {
badRequest(client, 'Timed out waiting for request.');
} else {
client.close();
}
}
}, kRequestTimeout);
} else {
let lastReadCount = readCount;
setTimeout(function() {
if (readCount == lastReadCount) {
client.info = 'stalled';
if (requestCount == 0) {
badRequest(client, 'Request stalled.');
} else {
client.close();
}
}
}, kStallTimeout);
}
}
resetTimeout(++requestCount);
client.setActivityTimeout(kRequestTimeout);
function reset() {
request = undefined;
@ -438,7 +407,7 @@ function handleConnection(client) {
bodyToRead = -1;
body = undefined;
client.info = 'reset';
resetTimeout(++requestCount);
client.setActivityTimeout(kRequestTimeout);
}
function finish() {
@ -463,9 +432,6 @@ function handleConnection(client) {
client.read(function(data) {
readCount++;
if (data) {
if (bodyToRead != -1 && !isWebsocket) {
resetTimeout(requestCount);
}
let newBuffer = new Uint8Array(inputBuffer.length + data.length);
newBuffer.set(inputBuffer, 0);
newBuffer.set(data, inputBuffer.length);
@ -483,6 +449,7 @@ function handleConnection(client) {
return;
}
} else if (typeof result === 'object') {
client.setActivityTimeout(kStallTimeout);
request = [
result.method,
result.path,
@ -509,7 +476,6 @@ function handleConnection(client) {
}
body = new Uint8Array(bodyToRead);
client.info = 'waiting for body';
resetTimeout(requestCount);
} else if (headers["connection"]
&& headers["connection"].toLowerCase().split(",").map(x => x.trim()).indexOf("upgrade") != -1
&& headers["upgrade"]
@ -520,7 +486,7 @@ function handleConnection(client) {
let response = new Response(requestObject, client);
handleWebSocketRequest(requestObject, response, client);
/* Prevent the timeout from disconnecting us. */
requestCount++;
client.setActivityTimeout();
} else {
finish();
}