diff --git a/src/cli/nso/http-server.ts b/src/cli/nso/http-server.ts index 7d7e3ee..3772ab3 100644 --- a/src/cli/nso/http-server.ts +++ b/src/cli/nso/http-server.ts @@ -193,14 +193,7 @@ class Server extends HttpServer { if (result) this.sendJsonResponse(res, result); else res.end(); } catch (err) { - if (err instanceof ResponseError) { - err.sendResponse(req, res); - } else { - this.sendJsonResponse(res, { - error: err, - error_message: (err as Error).message, - }, 500); - } + this.handleRequestError(req, res, err); } }; } diff --git a/src/cli/util/http-server.ts b/src/cli/util/http-server.ts index 7494746..e9eaa50 100644 --- a/src/cli/util/http-server.ts +++ b/src/cli/util/http-server.ts @@ -13,14 +13,7 @@ export class HttpServer { if (result) this.sendJsonResponse(res, result); else res.end(); } catch (err) { - if (err instanceof ResponseError) { - err.sendResponse(req, res); - } else { - this.sendJsonResponse(res, { - error: err, - error_message: (err as Error).message, - }, 500); - } + this.handleRequestError(req, res, err); } }; } @@ -34,14 +27,7 @@ export class HttpServer { next(); } catch (err) { - if (err instanceof ResponseError) { - err.sendResponse(req, res); - } else { - this.sendJsonResponse(res, { - error: err, - error_message: (err as Error).message, - }, 500); - } + this.handleRequestError(req, res, err); } }; } @@ -52,6 +38,33 @@ export class HttpServer { res.end(res.req.headers['accept']?.match(/\/html\b/i) ? JSON.stringify(data, null, 4) : JSON.stringify(data)); } + + protected handleRequestError(req: Request, res: Response, err: unknown) { + if (err instanceof ErrorResponse) { + const retry_after = err.response.headers.get('Retry-After'); + + if (retry_after && /^\d+$/.test(retry_after)) { + res.setHeader('Retry-After', retry_after); + } + } + + if (err && 'type' in err && 'code' in err && (err as any).type === 'system') { + const code: string = (err as any).code; + + if (code === 'ETIMEDOUT' || code === 'ENOTFOUND' || code === 'EAI_AGAIN') { + res.setHeader('Retry-After', '60'); + } + } + + if (err instanceof ResponseError) { + err.sendResponse(req, res); + } else { + this.sendJsonResponse(res, { + error: err, + error_message: (err as Error).message, + }, 500); + } + } } export class ResponseError extends Error {