Skip to content

Commit 2f805c9

Browse files
authored
feat(dart_frog): add fromShelfHandler and fromShelfMiddleware adapters (#56)
1 parent 8cc4f4f commit 2f805c9

File tree

4 files changed

+78
-15
lines changed

4 files changed

+78
-15
lines changed

packages/dart_frog/lib/src/_internal.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ part 'request_logger.dart';
1212
part 'response.dart';
1313
part 'router.dart';
1414
part 'serve.dart';
15+
part 'shelf_adapters.dart';

packages/dart_frog/lib/src/request_logger.dart

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,5 @@ part of '_internal.dart';
1313
Middleware requestLogger({
1414
void Function(String message, bool isError)? logger,
1515
}) {
16-
return _fromShelfMiddleware(shelf.logRequests(logger: logger));
17-
}
18-
19-
Middleware _fromShelfMiddleware(shelf.Middleware middleware) {
20-
return (handler) {
21-
return (context) async {
22-
final response = await middleware(
23-
(request) async {
24-
final response = await handler(RequestContext._(request));
25-
return response._response;
26-
},
27-
)(context.request._request);
28-
return Response._(response);
29-
};
30-
};
16+
return fromShelfMiddleware(shelf.logRequests(logger: logger));
3117
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
part of '_internal.dart';
2+
3+
/// Convert from [shelf.Middleware] into [Middleware].
4+
Middleware fromShelfMiddleware(shelf.Middleware middleware) {
5+
return (handler) {
6+
return (context) async {
7+
final response = await middleware(
8+
(request) async {
9+
final response = await handler(RequestContext._(request));
10+
return response._response;
11+
},
12+
)(context.request._request);
13+
return Response._(response);
14+
};
15+
};
16+
}
17+
18+
/// Convert from a [shelf.Handler] into a [Handler].
19+
Handler fromShelfHandler(shelf.Handler handler) {
20+
return (context) async {
21+
final response = await handler(context.request._request);
22+
return Response._(response);
23+
};
24+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import 'dart:io';
2+
3+
import 'package:dart_frog/src/_internal.dart';
4+
import 'package:http/http.dart' as http;
5+
import 'package:shelf/shelf.dart' as shelf;
6+
import 'package:test/test.dart';
7+
8+
void main() {
9+
group('fromShelfHandler', () {
10+
test('converts a shelf.Handler into a Handler', () async {
11+
Future<shelf.Response> handler(shelf.Request request) async {
12+
return shelf.Response.ok('Hello World');
13+
}
14+
15+
final server = await serve(fromShelfHandler(handler), 'localhost', 8000);
16+
final response = await http.get(Uri.parse('http://localhost:8000'));
17+
expect(response.statusCode, equals(HttpStatus.ok));
18+
expect(response.body, equals('Hello World'));
19+
await server.close();
20+
});
21+
});
22+
23+
group('fromShelfMiddleware', () {
24+
test('converts a shelf.Middleware into a Middleware', () async {
25+
shelf.Handler middleware(shelf.Handler handler) {
26+
return (request) {
27+
if (request.url.queryParameters.containsKey('foo')) {
28+
return shelf.Response.badRequest(body: 'oops!');
29+
}
30+
return handler(request);
31+
};
32+
}
33+
34+
final handler = const Pipeline()
35+
.addMiddleware(fromShelfMiddleware(middleware))
36+
.addHandler((_) => Response(body: 'Hello World'));
37+
38+
final server = await serve(handler, 'localhost', 8001);
39+
var response = await http.get(Uri.parse('http://localhost:8001'));
40+
expect(response.statusCode, equals(HttpStatus.ok));
41+
expect(response.body, equals('Hello World'));
42+
response = await http.get(
43+
Uri.parse('http://localhost:8001').replace(
44+
queryParameters: const <String, String>{'foo': 'bar'},
45+
),
46+
);
47+
expect(response.statusCode, equals(HttpStatus.badRequest));
48+
expect(response.body, equals('oops!'));
49+
await server.close();
50+
});
51+
});
52+
}

0 commit comments

Comments
 (0)