Skip to content

Commit 0955fbd

Browse files
authored
feat(dart_frog): add x-powered-by-header to serve (#337)
1 parent dc194a6 commit 0955fbd

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

packages/dart_frog/lib/src/serve.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@ part of '_internal.dart';
22

33
/// Starts an [HttpServer] that listens on the specified [address] and
44
/// [port] and sends requests to [handler].
5-
Future<HttpServer> serve(Handler handler, Object address, int port) {
5+
///
6+
/// Pass [poweredByHeader] to set the default content for "X-Powered-By",
7+
/// pass `null` to omit this header.
8+
/// By default, the header will be:
9+
///
10+
/// `"X-Powered-By": "Dart with package:dart_frog"`
11+
Future<HttpServer> serve(
12+
Handler handler,
13+
Object address,
14+
int port, {
15+
String? poweredByHeader = 'Dart with package:dart_frog',
16+
}) {
617
return shelf_io.serve(
718
(shelf.Request request) async {
819
final response = await handler(RequestContext._(request));
920
return response._response;
1021
},
1122
address,
1223
port,
24+
poweredByHeader: poweredByHeader,
1325
);
1426
}

packages/dart_frog/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ environment:
1111

1212
dependencies:
1313
http_methods: ^1.1.0
14-
shelf: ^1.1.0
14+
shelf: ^1.4.0
1515
shelf_hotreload: ^1.3.0
1616
shelf_static: ^1.1.1
1717

packages/dart_frog/test/src/serve_test.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,51 @@ void main() {
4242
expect(connectionInfo.remoteAddress.address, equals('::1'));
4343
await server.close();
4444
});
45+
46+
group('X-Powered-By-Header', () {
47+
test('is configured by default', () async {
48+
final server = await serve((_) => Response(), 'localhost', 3000);
49+
final client = HttpClient();
50+
final request = await client.getUrl(Uri.parse('http://localhost:3000'));
51+
final response = await request.close();
52+
expect(
53+
response.headers.value('X-Powered-By'),
54+
equals('Dart with package:dart_frog'),
55+
);
56+
await server.close();
57+
});
58+
59+
test('can be overridden', () async {
60+
const poweredByHeader = 'custom powered by header';
61+
final server = await serve(
62+
(_) => Response(),
63+
'localhost',
64+
3000,
65+
poweredByHeader: poweredByHeader,
66+
);
67+
final client = HttpClient();
68+
final request = await client.getUrl(Uri.parse('http://localhost:3000'));
69+
final response = await request.close();
70+
expect(
71+
response.headers.value('X-Powered-By'),
72+
equals(poweredByHeader),
73+
);
74+
await server.close();
75+
});
76+
77+
test('can be removed', () async {
78+
final server = await serve(
79+
(_) => Response(),
80+
'localhost',
81+
3000,
82+
poweredByHeader: null,
83+
);
84+
final client = HttpClient();
85+
final request = await client.getUrl(Uri.parse('http://localhost:3000'));
86+
final response = await request.close();
87+
expect(response.headers.value('X-Powered-By'), isNull);
88+
await server.close();
89+
});
90+
});
4591
});
4692
}

0 commit comments

Comments
 (0)