Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(242)

Side by Side Diff: mojo/public/dart/third_party/http_parser/lib/src/http_date.dart

Issue 1346773002: Stop running pub get at gclient sync time and fix build bugs (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library http_parser.http_date;
6
7 import 'package:string_scanner/string_scanner.dart';
8
9 import 'utils.dart';
10
11 const _WEEKDAYS = const ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
12 const _MONTHS = const ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
13 "Sep", "Oct", "Nov", "Dec"];
14
15 final _shortWeekdayRegExp = new RegExp(r"Mon|Tue|Wed|Thu|Fri|Sat|Sun");
16 final _longWeekdayRegExp =
17 new RegExp(r"Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday");
18 final _monthRegExp =
19 new RegExp(r"Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec");
20 final _digitRegExp = new RegExp(r"\d+");
21
22 /// Return a HTTP-formatted string representation of [date].
23 ///
24 /// This follows [RFC 822](http://tools.ietf.org/html/rfc822) as updated by [RFC
25 /// 1123](http://tools.ietf.org/html/rfc1123).
26 String formatHttpDate(DateTime date) {
27 date = date.toUtc();
28 var buffer = new StringBuffer()
29 ..write(_WEEKDAYS[date.weekday - 1])
30 ..write(", ")
31 ..write(date.day <= 9 ? "0" : "")
32 ..write(date.day.toString())
33 ..write(" ")
34 ..write(_MONTHS[date.month - 1])
35 ..write(" ")
36 ..write(date.year.toString())
37 ..write(date.hour <= 9 ? " 0" : " ")
38 ..write(date.hour.toString())
39 ..write(date.minute <= 9 ? ":0" : ":")
40 ..write(date.minute.toString())
41 ..write(date.second <= 9 ? ":0" : ":")
42 ..write(date.second.toString())
43 ..write(" GMT");
44 return buffer.toString();
45 }
46
47 /// Parses an HTTP-formatted date into a UTC [DateTime].
48 ///
49 /// This follows [RFC
50 /// 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3). It will
51 /// throw a [FormatException] if [date] is invalid.
52 DateTime parseHttpDate(String date) {
53 return wrapFormatException("HTTP date", date, () {
54 var scanner = new StringScanner(date);
55
56 if (scanner.scan(_longWeekdayRegExp)) {
57 // RFC 850 starts with a long weekday.
58 scanner.expect(", ");
59 var day = _parseInt(scanner, 2);
60 scanner.expect("-");
61 var month = _parseMonth(scanner);
62 scanner.expect("-");
63 var year = 1900 + _parseInt(scanner, 2);
64 scanner.expect(" ");
65 var time = _parseTime(scanner);
66 scanner.expect(" GMT");
67 scanner.expectDone();
68
69 return _makeDateTime(year, month, day, time);
70 }
71
72 // RFC 1123 and asctime both start with a short weekday.
73 scanner.expect(_shortWeekdayRegExp);
74 if (scanner.scan(", ")) {
75 // RFC 1123 follows the weekday with a comma.
76 var day = _parseInt(scanner, 2);
77 scanner.expect(" ");
78 var month = _parseMonth(scanner);
79 scanner.expect(" ");
80 var year = _parseInt(scanner, 4);
81 scanner.expect(" ");
82 var time = _parseTime(scanner);
83 scanner.expect(" GMT");
84 scanner.expectDone();
85
86 return _makeDateTime(year, month, day, time);
87 }
88
89 // asctime follows the weekday with a space.
90 scanner.expect(" ");
91 var month = _parseMonth(scanner);
92 scanner.expect(" ");
93 var day = scanner.scan(" ") ? _parseInt(scanner, 1) : _parseInt(scanner, 2);
94 scanner.expect(" ");
95 var time = _parseTime(scanner);
96 scanner.expect(" ");
97 var year = _parseInt(scanner, 4);
98 scanner.expectDone();
99
100 return _makeDateTime(year, month, day, time);
101 });
102 }
103
104 /// Parses a short-form month name to a form accepted by [DateTime].
105 int _parseMonth(StringScanner scanner) {
106 scanner.expect(_monthRegExp);
107 // DateTime uses 1-indexed months.
108 return _MONTHS.indexOf(scanner.lastMatch[0]) + 1;
109 }
110
111 /// Parses an int an enforces that it has exactly [digits] digits.
112 int _parseInt(StringScanner scanner, int digits) {
113 scanner.expect(_digitRegExp);
114 if (scanner.lastMatch[0].length != digits) {
115 scanner.error("expected a $digits-digit number.");
116 }
117
118 return int.parse(scanner.lastMatch[0]);
119 }
120
121 /// Parses an timestamp of the form "HH:MM:SS" on a 24-hour clock.
122 DateTime _parseTime(StringScanner scanner) {
123 var hours = _parseInt(scanner, 2);
124 if (hours >= 24) scanner.error("hours may not be greater than 24.");
125 scanner.expect(':');
126
127 var minutes = _parseInt(scanner, 2);
128 if (minutes >= 60) scanner.error("minutes may not be greater than 60.");
129 scanner.expect(':');
130
131 var seconds = _parseInt(scanner, 2);
132 if (seconds >= 60) scanner.error("seconds may not be greater than 60.");
133
134 return new DateTime(1, 1, 1, hours, minutes, seconds);
135 }
136
137 /// Returns a UTC [DateTime] from the given components.
138 ///
139 /// Validates that [day] is a valid day for [month]. If it's not, throws a
140 /// [FormatException].
141 DateTime _makeDateTime(int year, int month, int day, DateTime time) {
142 var dateTime =
143 new DateTime.utc(year, month, day, time.hour, time.minute, time.second);
144
145 // If [day] was too large, it will cause [month] to overflow.
146 if (dateTime.month != month) {
147 throw new FormatException("invalid day '$day' for month '$month'.");
148 }
149 return dateTime;
150 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698