Skip to content

Commit

Permalink
Review feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
brianquinlan committed Jan 12, 2024
1 parent 6577131 commit 812c43d
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 35 deletions.
2 changes: 1 addition & 1 deletion pkgs/http/lib/http.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import 'src/streamed_request.dart';

export 'src/base_client.dart';
export 'src/base_request.dart';
export 'src/base_response.dart' show BaseResponse, HeadersWithFieldLists;
export 'src/base_response.dart' show BaseResponse, HeadersWithSplitValues;
export 'src/byte_stream.dart';
export 'src/client.dart' hide zoneClient;
export 'src/exception.dart';
Expand Down
52 changes: 26 additions & 26 deletions pkgs/http/lib/src/base_response.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ abstract class BaseResponse {
/// ```
///
/// To retrieve the header values as a `List<String>`, use
/// [HeadersWithFieldLists.headersFieldValueList].
/// [HeadersWithSplitValues.headersSplitValues].
///
/// If a header value contains whitespace then that whitespace may be replaced
/// by a single space. Leading and trailing whitespace in header values are
Expand All @@ -71,36 +71,36 @@ abstract class BaseResponse {
}
}

// "token" as defined in RFC 2616, 2.2
// See https://datatracker.ietf.org/doc/html/rfc2616#section-2.2
/// "token" as defined in RFC 2616, 2.2
/// See https://datatracker.ietf.org/doc/html/rfc2616#section-2.2
const _tokenChars = r"!#$%&'*+\-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`"
'abcdefghijklmnopqrstuvwxyz|~';

// Splits comma-seperated header values.
/// Splits comma-seperated header values.
var _headerSplitter = RegExp(r'[ \t]*,[ \t]*');

// Splits comma-seperated "Set-Cookie" header values.
//
// Set-Cookie strings can contain commas. In particular, the following
// productions defined in RFC-6265, section 4.1.1:
// - <sane-cookie-date> e.g. "Expires=Sun, 06 Nov 1994 08:49:37 GMT"
// - <path-value> e.g. "Path=somepath,"
// - <extension-av> e.g. "AnyString,Really,"
//
// Some values are ambiguous e.g.
// "Set-Cookie: lang=en; Path=/foo/"
// "Set-Cookie: SID=x23"
// and:
// "Set-Cookie: lang=en; Path=/foo/,SID=x23"
// would both be result in `response.headers` => "lang=en; Path=/foo/,SID=x23"
//
// The idea behind this regex is that ",<valid token>=" is more likely to
// start a new <cookie-pair> then be part of <path-value> or <extension-av>.
//
// See https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1
/// Splits comma-seperated "Set-Cookie" header values.
///
/// Set-Cookie strings can contain commas. In particular, the following
/// productions defined in RFC-6265, section 4.1.1:
/// - <sane-cookie-date> e.g. "Expires=Sun, 06 Nov 1994 08:49:37 GMT"
/// - <path-value> e.g. "Path=somepath,"
/// - <extension-av> e.g. "AnyString,Really,"
///
/// Some values are ambiguous e.g.
/// "Set-Cookie: lang=en; Path=/foo/"
/// "Set-Cookie: SID=x23"
/// and:
/// "Set-Cookie: lang=en; Path=/foo/,SID=x23"
/// would both be result in `response.headers` => "lang=en; Path=/foo/,SID=x23"
///
/// The idea behind this regex is that ",<valid token>=" is more likely to
/// start a new <cookie-pair> then be part of <path-value> or <extension-av>.
///
/// See https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.1
var _setCookieSplitter = RegExp(r'[ \t]*,[ \t]*(?=[' + _tokenChars + r']+=)');

extension HeadersWithFieldLists on BaseResponse {
extension HeadersWithSplitValues on BaseResponse {
/// The HTTP headers returned by the server.
///
/// The header names are converted to lowercase and stored with their
Expand All @@ -116,10 +116,10 @@ extension HeadersWithFieldLists on BaseResponse {
/// final response = await Client().get(Uri.https('example.com', '/'));
/// final cookies = [
/// for (var value i
/// in response.headersFieldValueList['set-cookie'] ?? <String>[])
/// in response.headersSplitValues['set-cookie'] ?? <String>[])
/// Cookie.fromSetCookieValue(value)
/// ];
Map<String, List<String>> get headersFieldValueList {
Map<String, List<String>> get headersSplitValues {
var headersWithFieldLists = <String, List<String>>{};
headers.forEach((key, value) {
if (!value.contains(',')) {
Expand Down
16 changes: 8 additions & 8 deletions pkgs/http/test/response_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,32 +71,32 @@ void main() {
});
});

group('.headersFieldValueList', () {
group('.headersSplitValues', () {
test('no headers', () async {
var response = http.Response('Hello, world!', 200);
expect(response.headersFieldValueList, const <String, List<String>>{});
expect(response.headersSplitValues, const <String, List<String>>{});
});

test('one header', () async {
var response =
http.Response('Hello, world!', 200, headers: {'fruit': 'apple'});
expect(response.headersFieldValueList, const {
expect(response.headersSplitValues, const {
'fruit': ['apple']
});
});

test('two headers', () async {
var response = http.Response('Hello, world!', 200,
headers: {'fruit': 'apple,banana'});
expect(response.headersFieldValueList, const {
expect(response.headersSplitValues, const {
'fruit': ['apple', 'banana']
});
});

test('two headers with lots of spaces', () async {
var response = http.Response('Hello, world!', 200,
headers: {'fruit': 'apple \t , \tbanana'});
expect(response.headersFieldValueList, const {
expect(response.headersSplitValues, const {
'fruit': ['apple', 'banana']
});
});
Expand All @@ -105,7 +105,7 @@ void main() {
var response = http.Response('Hello, world!', 200, headers: {
'set-cookie': 'id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT'
});
expect(response.headersFieldValueList, const {
expect(response.headersSplitValues, const {
'set-cookie': ['id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT']
});
});
Expand All @@ -116,7 +116,7 @@ void main() {
'set-cookie': 'id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT,'
'sessionId=e8bb43229de9; Domain=foo.example.com'
});
expect(response.headersFieldValueList, const {
expect(response.headersSplitValues, const {
'set-cookie': [
'id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT',
'sessionId=e8bb43229de9; Domain=foo.example.com'
Expand All @@ -131,7 +131,7 @@ void main() {
'id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Path=/,,HE,=L=LO,'
'sessionId=e8bb43229de9; Domain=foo.example.com'
});
expect(response.headersFieldValueList, const {
expect(response.headersSplitValues, const {
'set-cookie': [
'id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Path=/,,HE,=L=LO',
'sessionId=e8bb43229de9; Domain=foo.example.com'
Expand Down

0 comments on commit 812c43d

Please sign in to comment.