Skip to content

Commit 9c15c6e

Browse files
authored
feat(dart_frog): toShelfMiddleware/toShelfHandler adapters (#97)
1 parent 9d23d33 commit 9c15c6e

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

packages/dart_frog/lib/src/shelf_adapters.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,32 @@ Middleware fromShelfMiddleware(shelf.Middleware middleware) {
1515
};
1616
}
1717

18+
/// Convert from [Middleware] into [shelf.Middleware].
19+
shelf.Middleware toShelfMiddleware(Middleware middleware) {
20+
return (innerHandler) {
21+
return (request) async {
22+
final response = await middleware((context) async {
23+
final response = await innerHandler(context.request._request);
24+
return Response._(response);
25+
})(RequestContext._(request));
26+
return response._response;
27+
};
28+
};
29+
}
30+
1831
/// Convert from a [shelf.Handler] into a [Handler].
1932
Handler fromShelfHandler(shelf.Handler handler) {
2033
return (context) async {
2134
final response = await handler(context.request._request);
2235
return Response._(response);
2336
};
2437
}
38+
39+
/// Convert from a [Handler] into a [shelf.Handler].
40+
shelf.Handler toShelfHandler(Handler handler) {
41+
return (request) async {
42+
final context = RequestContext._(request);
43+
final response = await handler.call(context);
44+
return response._response;
45+
};
46+
}

packages/dart_frog/test/src/shelf_adapters_test.dart

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'dart:io';
22

3+
import 'package:dart_frog/dart_frog.dart';
34
import 'package:dart_frog/src/_internal.dart';
45
import 'package:http/http.dart' as http;
56
import 'package:shelf/shelf.dart' as shelf;
7+
import 'package:shelf/shelf_io.dart' as shelf_io;
68
import 'package:test/test.dart';
79

810
void main() {
@@ -20,6 +22,24 @@ void main() {
2022
});
2123
});
2224

25+
group('toShelfHandler', () {
26+
test('converts a Handler into a shelf.Handler', () async {
27+
Future<Response> handler(RequestContext context) async {
28+
return Response(body: 'Hello World');
29+
}
30+
31+
final server = await shelf_io.serve(
32+
toShelfHandler(handler),
33+
'localhost',
34+
8001,
35+
);
36+
final response = await http.get(Uri.parse('http://localhost:8001'));
37+
expect(response.statusCode, equals(HttpStatus.ok));
38+
expect(response.body, equals('Hello World'));
39+
await server.close();
40+
});
41+
});
42+
2343
group('fromShelfMiddleware', () {
2444
test('converts a shelf.Middleware into a Middleware', () async {
2545
shelf.Handler middleware(shelf.Handler handler) {
@@ -35,12 +55,42 @@ void main() {
3555
.addMiddleware(fromShelfMiddleware(middleware))
3656
.addHandler((_) => Response(body: 'Hello World'));
3757

38-
final server = await serve(handler, 'localhost', 8001);
39-
var response = await http.get(Uri.parse('http://localhost:8001'));
58+
final server = await serve(handler, 'localhost', 8002);
59+
var response = await http.get(Uri.parse('http://localhost:8002'));
60+
expect(response.statusCode, equals(HttpStatus.ok));
61+
expect(response.body, equals('Hello World'));
62+
response = await http.get(
63+
Uri.parse('http://localhost:8002').replace(
64+
queryParameters: const <String, String>{'foo': 'bar'},
65+
),
66+
);
67+
expect(response.statusCode, equals(HttpStatus.badRequest));
68+
expect(response.body, equals('oops!'));
69+
await server.close();
70+
});
71+
});
72+
73+
group('toShelfMiddleware', () {
74+
test('converts a Middleware into a shelf.Middleware', () async {
75+
Handler middleware(Handler handler) {
76+
return (context) {
77+
if (context.request.url.queryParameters.containsKey('foo')) {
78+
return Response(statusCode: HttpStatus.badRequest, body: 'oops!');
79+
}
80+
return handler(context);
81+
};
82+
}
83+
84+
final handler = const shelf.Pipeline()
85+
.addMiddleware(toShelfMiddleware(middleware))
86+
.addHandler((_) => shelf.Response.ok('Hello World'));
87+
88+
final server = await shelf_io.serve(handler, 'localhost', 8003);
89+
var response = await http.get(Uri.parse('http://localhost:8003'));
4090
expect(response.statusCode, equals(HttpStatus.ok));
4191
expect(response.body, equals('Hello World'));
4292
response = await http.get(
43-
Uri.parse('http://localhost:8001').replace(
93+
Uri.parse('http://localhost:8003').replace(
4494
queryParameters: const <String, String>{'foo': 'bar'},
4595
),
4696
);

0 commit comments

Comments
 (0)