Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
## 1.1.3-dev
## 1.1.3

* Automatically remove `content-length` header from a `Response.notModified`.
Restores some of the safety around malformed requests that was removed in
`1.1.2` where we started allowing `content-length` for some responses without
bodies.

## 1.1.2

Expand Down
6 changes: 5 additions & 1 deletion lib/src/response.dart
Original file line number Diff line number Diff line change
Expand Up @@ -192,12 +192,16 @@ class Response extends Message {
///
/// [headers] must contain values that are either `String` or `List<String>`.
/// An empty list will cause the header to be omitted.
///
/// If [headers] contains a value for `content-length` it will be removed.
Response.notModified({
Map<String, /* String | List<String> */ Object>? headers,
Map<String, Object>? context,
}) : this(
304,
headers: addHeader(headers, 'date', formatHttpDate(DateTime.now())),
headers: removeHeader(
addHeader(headers, 'date', formatHttpDate(DateTime.now())),
'content-length'),
context: context,
);

Expand Down
12 changes: 12 additions & 0 deletions lib/src/util.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,18 @@ Map<String, Object> addHeader(
return headers;
}

/// Removed the header with case-insensitive name [name].
///
/// Returns a new map without modifying [headers].
Map<String, Object> removeHeader(
Map<String, Object>? headers,
String name,
) {
headers = headers == null ? {} : Map.from(headers);
headers.removeWhere((header, value) => equalsIgnoreAsciiCase(header, name));
return headers;
}

/// Returns the header with the given [name] in [headers].
///
/// This works even if [headers] is `null`, or if it's not yet a
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: shelf
version: 1.1.3-dev
version: 1.1.3
description: >-
A model for web server middleware that encourages composition and easy reuse
repository: https://github.com/dart-lang/shelf
Expand Down
7 changes: 7 additions & 0 deletions test/response_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ void main() {
expect(await response.readAsString(), isEmpty);
});

test('clears content-length for notModified response', () async {
var response = Response.notModified(headers: {'Content-Length': '42'});

expect(response.contentLength, 0);
expect(await response.readAsString(), isEmpty);
});

group('new Response.internalServerError without a body', () {
test('sets the body to "Internal Server Error"', () {
var response = Response.internalServerError();
Expand Down