platform/packages/shelf/lib/src/embed_shelf.dart
Tobe O ee512d5ccf Add 'packages/shelf/' from commit '1923132532665f8a26d9a12fc9db2f2073611e45'
git-subtree-dir: packages/shelf
git-subtree-mainline: a7842bddd8
git-subtree-split: 1923132532
2020-02-15 18:22:23 -05:00

35 lines
1.3 KiB
Dart

import 'package:angel_framework/angel_framework.dart';
import 'package:shelf/shelf.dart' as shelf;
import 'convert.dart';
/// Simply passes an incoming request to a `shelf` handler.
///
/// If the handler does not return a [shelf.Response], then the
/// result will be passed down the Angel middleware pipeline, like with
/// any other request handler.
///
/// If [throwOnNullResponse] is `true` (default: `false`), then a 500 error will be thrown
/// if the [handler] returns `null`.
RequestHandler embedShelf(shelf.Handler handler,
{String handlerPath,
Map<String, Object> context,
bool throwOnNullResponse = false}) {
return (RequestContext req, ResponseContext res) async {
var shelfRequest = await convertRequest(req, res,
handlerPath: handlerPath, context: context);
try {
var result = await handler(shelfRequest);
if (result is! shelf.Response && result != null) return result;
if (result == null && throwOnNullResponse == true) {
throw AngelHttpException('Internal Server Error');
}
await mergeShelfResponse(result, res);
return false;
} on shelf.HijackException {
// On hijack, do nothing, because the hijack handlers already call res.detach();
return null;
} catch (e) {
rethrow;
}
};
}