Skip to content

Commit

Permalink
Merge pull request #46 from PyreStudios/response-writing-refactor
Browse files Browse the repository at this point in the history
refactor(response): pull out response writing to a single place
  • Loading branch information
bradcypert committed Oct 5, 2023
2 parents ec6839a + 7eb2a65 commit 4b20695
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 101 deletions.
64 changes: 36 additions & 28 deletions lib/router/router.dart
Expand Up @@ -150,60 +150,68 @@ class Router {

// Build a new regex by removing the $, adding in the optional trailing slash
// and then adding the end terminator back on ($).
var cleanedPattern = rootPattern.substring(0, rootPattern.lastIndexOf('\$'));
var cleanedPattern =
rootPattern.substring(0, rootPattern.lastIndexOf('\$'));
// account for the path already ending in slash
if (cleanedPattern.endsWith('/')) {
cleanedPattern =
cleanedPattern.substring(0, cleanedPattern.length - 1);
}
var regex = RegExp('$cleanedPattern\\/?${bindings[i].isPrefixBinding ? '\$)' :'\$'}', caseSensitive: false);
var regex = RegExp(
'$cleanedPattern\\/?${bindings[i].isPrefixBinding ? '\$)' : '\$'}',
caseSensitive: false);
hasMatch = regex.hasMatch(request.uri.path);

if (hasMatch) {
// TODO: We can clean up the unmatched path a bit too
var match = regex.matchAsPrefix(request.uri.path);
if (match != null) {
var pathParams = extract(params, match);
var req = Request(request: request, pathParams: pathParams)
..setContainer(container.clone());

var allMiddlewares = [
...bindings[i].middleware.reversed,
...middleware.reversed,
];

try {
var handler = bindings[i].process;
allMiddlewares.forEach((element) async {
handler = element(handler);
});

var response = handler(req);
await writeResponse(request, response);
} catch (err, stacktrace) {
await writeErrorResponse(request, err, stacktrace);
}
await processHandlersWithMiddleware(
bindings[i].process,
[
...bindings[i].middleware.reversed,
...middleware.reversed,
],
req,
request);
break;
}
}
}

if (!hasMatch) {
// TODO: We can clean this up a bit
var allMiddlewares = [...middleware.reversed];
var handler = (Request req) => Future.value(Response.NotFound());
allMiddlewares.forEach((element) {
handler = element(handler);
});

var response = handler(Request(request: request));
await writeResponse(request, response);
await processHandlersWithMiddleware(
(Request req) => Future.value(Response.NotFound()),
[...middleware.reversed],
Request(request: request),
request);
}

await request.response.close();
}
}

Future<void> processHandlersWithMiddleware(
Future<Response> Function(Request request) initialHandler,
List<Function> allMiddlewares,
Request req,
HttpRequest request) async {
try {
var handler = initialHandler;
allMiddlewares.forEach((element) async {
handler = element(handler);
});

var response = handler(req);
await writeResponse(request, response);
} catch (err, stacktrace) {
await writeErrorResponse(request, err, stacktrace);
}
}

Future<void> writeErrorResponse(request, err, stacktrace) async {
if (container.make('@environment') == Environment.production) {
// if things are production, we need to treat this all differently.
Expand Down

0 comments on commit 4b20695

Please sign in to comment.