more debug
This commit is contained in:
@@ -142,11 +142,16 @@ class RPCProxy {
|
|||||||
method: requestBody.method,
|
method: requestBody.method,
|
||||||
params: requestBody.params,
|
params: requestBody.params,
|
||||||
endpoint: 'incoming',
|
endpoint: 'incoming',
|
||||||
|
httpVersion: req.httpVersion,
|
||||||
|
connection: req.headers.connection,
|
||||||
|
userAgent: req.headers['user-agent'],
|
||||||
|
acceptEncoding: req.headers['accept-encoding'],
|
||||||
}, 'Received JSON-RPC request');
|
}, 'Received JSON-RPC request');
|
||||||
|
|
||||||
// Handle client disconnect
|
// Handle client disconnect
|
||||||
let clientClosed = false;
|
let clientClosed = false;
|
||||||
let clientCloseReason = null;
|
let clientCloseReason = null;
|
||||||
|
let responseCompleted = false;
|
||||||
|
|
||||||
req.on('close', () => {
|
req.on('close', () => {
|
||||||
if (!clientClosed) {
|
if (!clientClosed) {
|
||||||
@@ -160,6 +165,7 @@ class RPCProxy {
|
|||||||
contentLength: req.headers['content-length'],
|
contentLength: req.headers['content-length'],
|
||||||
method: requestBody.method,
|
method: requestBody.method,
|
||||||
elapsedMs: Date.now() - startTime,
|
elapsedMs: Date.now() - startTime,
|
||||||
|
responseCompleted,
|
||||||
}, 'Client connection closed');
|
}, 'Client connection closed');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -198,7 +204,7 @@ class RPCProxy {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Start both requests in parallel
|
// Start both requests in parallel
|
||||||
const streamPromise = this.streamResponse(requestId, requestBody, res, startTime, () => clientClosed);
|
const streamPromise = this.streamResponse(requestId, requestBody, res, startTime, () => clientClosed, () => responseCompleted = true);
|
||||||
const comparePromise = this.compareResponse(requestId, requestBody, startTime);
|
const comparePromise = this.compareResponse(requestId, requestBody, startTime);
|
||||||
|
|
||||||
// Wait for the stream to complete and get response info
|
// Wait for the stream to complete and get response info
|
||||||
@@ -237,7 +243,7 @@ class RPCProxy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async streamResponse(requestId, requestBody, res, startTime, isClientClosed) {
|
async streamResponse(requestId, requestBody, res, startTime, isClientClosed, isResponseCompleted) {
|
||||||
let responseData = '';
|
let responseData = '';
|
||||||
let statusCode = 0;
|
let statusCode = 0;
|
||||||
let upstreamResponse = null;
|
let upstreamResponse = null;
|
||||||
@@ -273,9 +279,14 @@ class RPCProxy {
|
|||||||
if (!isClientClosed() && !res.headersSent) {
|
if (!isClientClosed() && !res.headersSent) {
|
||||||
res.status(response.status);
|
res.status(response.status);
|
||||||
|
|
||||||
// Ensure proper keep-alive handling
|
// Respect client's connection preference
|
||||||
res.setHeader('Connection', 'keep-alive');
|
const clientConnection = res.req.headers.connection;
|
||||||
res.setHeader('Keep-Alive', `timeout=${Math.floor(config.requestTimeout / 1000)}`);
|
if (clientConnection && clientConnection.toLowerCase() === 'close') {
|
||||||
|
res.setHeader('Connection', 'close');
|
||||||
|
} else {
|
||||||
|
res.setHeader('Connection', 'keep-alive');
|
||||||
|
res.setHeader('Keep-Alive', `timeout=${Math.floor(config.requestTimeout / 1000)}`);
|
||||||
|
}
|
||||||
|
|
||||||
Object.entries(response.headers).forEach(([key, value]) => {
|
Object.entries(response.headers).forEach(([key, value]) => {
|
||||||
// Don't override Connection header we just set
|
// Don't override Connection header we just set
|
||||||
@@ -321,6 +332,8 @@ class RPCProxy {
|
|||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
response.data.on('end', () => {
|
response.data.on('end', () => {
|
||||||
|
isResponseCompleted(); // Mark response as completed
|
||||||
|
|
||||||
if (!isClientClosed() && !res.writableEnded) {
|
if (!isClientClosed() && !res.writableEnded) {
|
||||||
try {
|
try {
|
||||||
res.end();
|
res.end();
|
||||||
@@ -338,6 +351,24 @@ class RPCProxy {
|
|||||||
const rawData = Buffer.concat(chunks);
|
const rawData = Buffer.concat(chunks);
|
||||||
responseData = rawData.toString('utf8');
|
responseData = rawData.toString('utf8');
|
||||||
|
|
||||||
|
// Log if client closed very early
|
||||||
|
if (isClientClosed() && totalTime < 10) {
|
||||||
|
logger.warn({
|
||||||
|
requestId,
|
||||||
|
endpoint: 'stream',
|
||||||
|
totalTimeMs: totalTime,
|
||||||
|
responseSize: rawData.length,
|
||||||
|
contentEncoding: response.headers['content-encoding'],
|
||||||
|
responseHeaders: response.headers,
|
||||||
|
method: requestBody.method,
|
||||||
|
httpVersion: res.req.httpVersion,
|
||||||
|
keepAlive: res.req.headers.connection,
|
||||||
|
clientClosedAt: clientCloseReason,
|
||||||
|
// For small responses, log the actual data to see what's happening
|
||||||
|
responseData: rawData.length < 200 ? responseData : '[truncated]',
|
||||||
|
}, 'Client closed connection very quickly');
|
||||||
|
}
|
||||||
|
|
||||||
logger.info({
|
logger.info({
|
||||||
requestId,
|
requestId,
|
||||||
endpoint: 'stream',
|
endpoint: 'stream',
|
||||||
|
|||||||
Reference in New Issue
Block a user