Skip to content

Commit b1c68df

Browse files
committed
feat: Wrap error handler around main HTTP handler
1 parent 6f86509 commit b1c68df

8 files changed

Lines changed: 45 additions & 60 deletions

File tree

packages/uma/config/default.json

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -85,25 +85,29 @@
8585
"includeQueryString": true
8686
},
8787
"httpHandler": {
88-
"@id": "urm:uma:default:JsonFormHttpHandler",
89-
"@type": "JsonFormHttpHandler",
88+
"@id": "urm:uma:default:JsonHttpErrorHandler",
89+
"@type": "JsonHttpErrorHandler",
9090
"handler": {
91-
"@id": "urn:uma:default:RoutedHttpRequestHandler",
92-
"@type": "RoutedHttpRequestHandler",
93-
"routes": [
94-
{ "@id": "urn:uma:default:UmaConfigRoute" },
95-
{ "@id": "urn:uma:default:JwksRoute" },
96-
{ "@id": "urn:uma:default:DemoTokenRoute" },
97-
{ "@id": "urn:uma:default:PermissionRegistrationRoute" },
98-
{ "@id": "urn:uma:default:ResourceRegistrationRoute" },
99-
{ "@id": "urn:uma:default:ResourceRegistrationOpsRoute" },
100-
{ "@id": "urn:uma:default:IntrospectionRoute" },
91+
"@id": "urm:uma:default:JsonFormHttpHandler",
92+
"@type": "JsonFormHttpHandler",
93+
"handler": {
94+
"@id": "urn:uma:default:RoutedHttpRequestHandler",
95+
"@type": "RoutedHttpRequestHandler",
96+
"routes": [
97+
{ "@id": "urn:uma:default:UmaConfigRoute" },
98+
{ "@id": "urn:uma:default:JwksRoute" },
99+
{ "@id": "urn:uma:default:DemoTokenRoute" },
100+
{ "@id": "urn:uma:default:PermissionRegistrationRoute" },
101+
{ "@id": "urn:uma:default:ResourceRegistrationRoute" },
102+
{ "@id": "urn:uma:default:ResourceRegistrationOpsRoute" },
103+
{ "@id": "urn:uma:default:IntrospectionRoute" },
101104
{ "@id": "urn:uma:default:LogRoute" },
102105
{ "@id": "urn:uma:default:VCRoute" },
103106
{ "@id": "urn:uma:default:ContractRoute" }
104-
],
105-
"defaultHandler": {
106-
"@type": "DefaultRequestHandler"
107+
],
108+
"defaultHandler": {
109+
"@type": "DefaultRequestHandler"
110+
}
107111
}
108112
}
109113
}

packages/uma/config/routes/introspection.json

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@
88
"@type": "HttpHandlerRoute",
99
"methods": [ "POST" ],
1010
"handler": {
11-
"@type": "JsonHttpErrorHandler",
12-
"nestedHandler": {
13-
"@type": "IntrospectionHandler",
14-
"tokenStore": { "@id": "urn:uma:default:TokenStore" },
15-
"jwtTokenFactory": { "@id": "urn:uma:default:TokenFactory" }
16-
}
11+
"@type": "IntrospectionHandler",
12+
"tokenStore": { "@id": "urn:uma:default:TokenStore" },
13+
"jwtTokenFactory": { "@id": "urn:uma:default:TokenFactory" }
1714
},
1815
"path": "/uma/introspect"
1916
}

packages/uma/config/routes/tickets.json

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@
88
"@type": "HttpHandlerRoute",
99
"methods": [ "POST" ],
1010
"handler": {
11-
"@type": "JsonHttpErrorHandler",
12-
"nestedHandler": {
13-
"@type": "TicketRequestHandler",
14-
"ticketingStrategy": { "@id": "urn:uma:default:TicketingStrategy" },
15-
"ticketStore": { "@id": "urn:uma:default:TicketStore" }
16-
}
11+
"@type": "TicketRequestHandler",
12+
"ticketingStrategy": { "@id": "urn:uma:default:TicketingStrategy" },
13+
"ticketStore": { "@id": "urn:uma:default:TicketStore" }
1714
},
1815
"path": "/uma/ticket"
1916
}

packages/uma/config/routes/tokens.json

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@
88
"@type": "HttpHandlerRoute",
99
"methods": [ "POST" ],
1010
"handler": {
11-
"@type": "JsonHttpErrorHandler",
12-
"nestedHandler": {
13-
"@type": "TokenRequestHandler",
14-
"negotiator": { "@id": "urn:uma:default:Negotiator" }
15-
}
11+
"@type": "TokenRequestHandler",
12+
"negotiator": { "@id": "urn:uma:default:Negotiator" }
1613
},
1714
"path": "/uma/token"
1815
}

packages/uma/config/routes/tokens_contract.json

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@
88
"@type": "HttpHandlerRoute",
99
"methods": [ "POST" ],
1010
"handler": {
11-
"@type": "JsonHttpErrorHandler",
12-
"nestedHandler": {
13-
"@type": "TokenRequestHandler",
14-
"negotiator": { "@id": "urn:uma:default:DemoNegotiator" }
15-
}
11+
"@type": "TokenRequestHandler",
12+
"negotiator": { "@id": "urn:uma:default:DemoNegotiator" }
1613
},
1714
"path": "/uma/token"
1815
}

packages/uma/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export * from './views/ScopeDescription';
6363
export * from './util/http/identifier/BaseTargetExtractor';
6464
export * from './util/http/models/HttpHandler';
6565
export * from './util/http/models/HttpHandlerRoute';
66-
export * from './util/http/server/ErrorHandler';
66+
export * from './util/http/server/JsonHttpErrorHandler';
6767
export * from './util/http/server/JsonFormHttpHandler';
6868
export * from './util/http/server/NodeHttpRequestResponseHandler';
6969
export * from './util/http/server/RoutedHttpRequestHandler';

packages/uma/src/util/http/server/ErrorHandler.ts renamed to packages/uma/src/util/http/server/JsonHttpErrorHandler.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getLoggerFor } from '@solid/community-server';
1+
import { createErrorMessage, getLoggerFor } from '@solid/community-server';
22
import { HttpHandler, HttpHandlerContext, HttpHandlerResponse } from '../models/HttpHandler';
33

44
export const statusCodes: { [code: number]: string } = {
@@ -46,32 +46,37 @@ export const statusCodes: { [code: number]: string } = {
4646

4747
/**
4848
* Handler class that properly processes the HttpErrors and returns JSON responses.
49+
* Both canHandle and handle response errors will be returned as a JSON response,
50+
* describing the error.
4951
*/
50-
export class JsonHttpErrorHandler extends HttpHandler {
52+
export class JsonHttpErrorHandler extends HttpHandler<HttpHandlerContext<Buffer>, Buffer> {
5153
protected readonly logger = getLoggerFor(this);
5254

5355
constructor(
54-
private nestedHandler: HttpHandler,
56+
protected handler: HttpHandler<HttpHandlerContext<Buffer>, Buffer>,
5557
) {
5658
super();
5759
}
5860

59-
async handle(context: HttpHandlerContext): Promise<HttpHandlerResponse> {
61+
async handle(context: HttpHandlerContext<Buffer>): Promise<HttpHandlerResponse<Buffer>> {
6062
try {
61-
return await this.nestedHandler.handleSafe(context);
63+
return await this.handler.handleSafe(context);
6264
} catch (error) {
6365
this.logger.error(`Returned error for ${context.request.method} '${context.request.url}':` +
64-
` ${(error as Error).name} ${(error as Error).message} ${JSON.stringify(error)}`);
66+
` ${createErrorMessage(error)}`);
6567

6668
return {
6769
status: statusCodes[error?.statusCode] ? error.statusCode : 500,
68-
body: {
70+
headers: {
71+
'content-type': 'application/json',
72+
},
73+
body: Buffer.from(JSON.stringify({
6974
'status': statusCodes[error?.statusCode] ? error.statusCode : 500,
7075
'description': statusCodes[error?.statusCode] ? statusCodes[error.statusCode] : statusCodes[500],
7176
'error': error?.type ?? error.type,
7277
'message': error?.message ?? error.message,
7378
...(error?.additionalParams ? error.additionalParams : {}),
74-
}
79+
})),
7580
};
7681
}
7782
}

packages/uma/src/util/http/server/NodeHttpRequestResponseHandler.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import {
22
BadRequestHttpError,
3-
createErrorMessage,
43
getLoggerFor,
54
HttpHandler as NodeHttpStreamsHandler,
65
HttpHandlerInput,
76
TargetExtractor
87
} from '@solid/community-server';
98
import { buffer } from 'node:stream/consumers';
10-
import { HttpHandler, HttpHandlerContext, HttpHandlerRequest, HttpHandlerResponse } from '../models/HttpHandler';
11-
import { statusCodes } from './ErrorHandler';
9+
import { HttpHandler, HttpHandlerContext, HttpHandlerRequest } from '../models/HttpHandler';
1210

1311

1412
/**
@@ -72,17 +70,7 @@ export class NodeHttpRequestResponseHandler extends NodeHttpStreamsHandler {
7270

7371
this.logger.info(`Domestic request: ${JSON.stringify({ eventType: 'domestic_request', context })}`);
7472

75-
let response = await this.httpHandler.handleSafe(context).catch<HttpHandlerResponse<Buffer>>((error) => {
76-
const status = error?.statusCode ?? error.status;
77-
const message = error?.message ?? error.body;
78-
79-
this.logger.error(`Unhandled error: ${createErrorMessage(error)}`);
80-
81-
return {
82-
body: Buffer.from(message ?? 'Internal Server Error'),
83-
status: statusCodes[status] ? status : 500
84-
};
85-
});
73+
let response = await this.httpHandler.handleSafe(context);
8674

8775
response.headers = {
8876
// headers could be undefined at this point

0 commit comments

Comments
 (0)