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

Side by Side Diff: pkg/http_server/test/utils.dart

Issue 721213002: Fix a number of issues with the Range header handling for serving files (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix test Created 6 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library utils; 5 library utils;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:convert'; 8 import 'dart:convert';
9 import 'dart:io'; 9 import 'dart:io';
10 import "package:unittest/unittest.dart"; 10 import "package:unittest/unittest.dart";
(...skipping 24 matching lines...) Expand all
35 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); 35 var dir = Directory.systemTemp.createTempSync('http_server_virtual_');
36 36
37 return func(dir) 37 return func(dir)
38 .whenComplete(() { 38 .whenComplete(() {
39 return dir.delete(recursive: true); 39 return dir.delete(recursive: true);
40 }); 40 });
41 }); 41 });
42 } 42 }
43 43
44 Future<int> getStatusCodeForVirtDir(VirtualDirectory virtualDir, 44 Future<int> getStatusCodeForVirtDir(VirtualDirectory virtualDir,
45 String path, 45 String path,
46 {String host, 46 {String host,
47 bool secure: false, 47 bool secure: false,
48 DateTime ifModifiedSince, 48 DateTime ifModifiedSince,
49 bool rawPath: false, 49 bool rawPath: false,
50 bool followRedirects: true}) { 50 bool followRedirects: true,
51 int from,
52 int to}) {
51 53
52 // if this is a mock test, then run the mock code path 54 // if this is a mock test, then run the mock code path
53 if(_isMockTestExpando[currentTestCase]) { 55 if(_isMockTestExpando[currentTestCase]) {
54 var uri = _getUri(0, path, secure: secure, rawPath: rawPath); 56 var uri = _getUri(0, path, secure: secure, rawPath: rawPath);
55 57
56 var request = new MockHttpRequest(uri, followRedirects: followRedirects, 58 var request = new MockHttpRequest(uri, followRedirects: followRedirects,
57 ifModifiedSince: ifModifiedSince); 59 ifModifiedSince: ifModifiedSince);
60 _addRangeHeader(request, from, to);
58 61
59 return _withMockRequest(virtualDir, request) 62 return _withMockRequest(virtualDir, request)
60 .then((response) { 63 .then((response) {
61 return response.statusCode; 64 return response.statusCode;
62 }); 65 });
63 }; 66 };
64 67
65 assert(_isMockTestExpando[currentTestCase] == false); 68 assert(_isMockTestExpando[currentTestCase] == false);
66 69
67 return _withServer(virtualDir, (port) { 70 return _withServer(virtualDir, (port) {
68 return getStatusCode(port, path, host: host, secure: secure, 71 return getStatusCode(port, path, host: host, secure: secure,
69 ifModifiedSince: ifModifiedSince, rawPath: rawPath, 72 ifModifiedSince: ifModifiedSince, rawPath: rawPath,
70 followRedirects: followRedirects); 73 followRedirects: followRedirects, from: from, to: to);
71 }); 74 });
72 } 75 }
73 76
74 Future<int> getStatusCode(int port, 77 Future<int> getStatusCode(int port,
75 String path, 78 String path,
76 {String host, 79 {String host,
77 bool secure: false, 80 bool secure: false,
78 DateTime ifModifiedSince, 81 DateTime ifModifiedSince,
79 bool rawPath: false, 82 bool rawPath: false,
80 bool followRedirects: true}) { 83 bool followRedirects: true,
84 int from,
85 int to}) {
81 var uri = _getUri(port, path, secure: secure, rawPath: rawPath); 86 var uri = _getUri(port, path, secure: secure, rawPath: rawPath);
82 87
83 return new HttpClient().getUrl(uri) 88 return new HttpClient().getUrl(uri)
84 .then((request) { 89 .then((request) {
85 if (!followRedirects) request.followRedirects = false; 90 if (!followRedirects) request.followRedirects = false;
86 if (host != null) request.headers.host = host; 91 if (host != null) request.headers.host = host;
87 if (ifModifiedSince != null) { 92 if (ifModifiedSince != null) {
88 request.headers.ifModifiedSince = ifModifiedSince; 93 request.headers.ifModifiedSince = ifModifiedSince;
89 } 94 }
95 _addRangeHeader(request, from, to);
90 return request.close(); 96 return request.close();
91 }) 97 })
92 .then((response) => response.drain().then( 98 .then((response) => response.drain().then(
93 (_) => response.statusCode)); 99 (_) => response.statusCode));
94 } 100 }
95 101
96 Future<HttpHeaders> getHeaders(VirtualDirectory virDir, String path) { 102 Future<HttpHeaders> getHeaders(
103 VirtualDirectory virDir, String path, {int from, int to}) {
97 104
98 // if this is a mock test, then run the mock code path 105 // if this is a mock test, then run the mock code path
99 if(_isMockTestExpando[currentTestCase]) { 106 if(_isMockTestExpando[currentTestCase]) {
100 var uri = _getUri(0, path); 107 var uri = _getUri(0, path);
101 108
102 var request = new MockHttpRequest(uri); 109 var request = new MockHttpRequest(uri);
110 _addRangeHeader(request, from, to);
103 111
104 return _withMockRequest(virDir, request) 112 return _withMockRequest(virDir, request)
105 .then((response) { 113 .then((response) {
106 return response.headers; 114 return response.headers;
107 }); 115 });
108 } 116 }
109 117
110 assert(_isMockTestExpando[currentTestCase] == false); 118 assert(_isMockTestExpando[currentTestCase] == false);
111 119
112 return _withServer(virDir, (port) { 120 return _withServer(virDir, (port) {
113 return _getHeaders(port, path); 121 return _getHeaders(port, path, from, to);
114 }); 122 });
115 } 123 }
116 124
117 Future<String> getAsString(VirtualDirectory virtualDir, String path) { 125 Future<String> getAsString(VirtualDirectory virtualDir, String path) {
118 126
119 // if this is a mock test, then run the mock code path 127 // if this is a mock test, then run the mock code path
120 if(_isMockTestExpando[currentTestCase]) { 128 if(_isMockTestExpando[currentTestCase]) {
121 var uri = _getUri(0, path); 129 var uri = _getUri(0, path);
122 130
123 var request = new MockHttpRequest(uri); 131 var request = new MockHttpRequest(uri);
124 132
125 return _withMockRequest(virtualDir, request) 133 return _withMockRequest(virtualDir, request)
126 .then((response) { 134 .then((response) {
127 return response.mockContent; 135 return response.mockContent;
128 }); 136 });
129 }; 137 };
130 138
131 assert(_isMockTestExpando[currentTestCase] == false); 139 assert(_isMockTestExpando[currentTestCase] == false);
132 140
133 return _withServer(virtualDir, (int port) { 141 return _withServer(virtualDir, (int port) {
134 return _getAsString(port, path); 142 return _getAsString(port, path);
135 }); 143 });
136 } 144 }
137 145
146 Future<String> getAsBytes(
147 VirtualDirectory virtualDir, String path, {int from, int to}) {
148
149 // if this is a mock test, then run the mock code path
150 if(_isMockTestExpando[currentTestCase]) {
kustermann 2014/11/14 13:25:27 space after 'if'
Søren Gjesse 2014/11/14 15:27:29 Done.
151 var uri = _getUri(0, path);
152
153 var request = new MockHttpRequest(uri);
154 _addRangeHeader(request, from, to);
155
156 return _withMockRequest(virtualDir, request)
157 .then((response) {
158 return response.mockContentBinary;
159 });
160 };
161
162 assert(_isMockTestExpando[currentTestCase] == false);
kustermann 2014/11/14 13:25:27 This assert is not doing anything, If you go into
Søren Gjesse 2014/11/14 15:27:30 Honestly don't know. It is in all these methods.
163
164 return _withServer(virtualDir, (int port) {
165 return _getAsBytes(port, path, from, to);
kustermann 2014/11/14 13:25:27 _getAsBytes is returning Future<List<int>> but the
Søren Gjesse 2014/11/14 15:27:29 Done.
166 });
167 }
168
138 Future<MockHttpResponse> _withMockRequest(VirtualDirectory virDir, 169 Future<MockHttpResponse> _withMockRequest(VirtualDirectory virDir,
139 MockHttpRequest request) { 170 MockHttpRequest request) {
140 return virDir.serveRequest(request).then((value) { 171 return virDir.serveRequest(request).then((value) {
141 expect(value, isNull); 172 expect(value, isNull);
142 expect(request.response.mockDone, isTrue); 173 expect(request.response.mockDone, isTrue);
143 return request.response; 174 return request.response;
144 }) 175 })
145 .then((HttpResponse response) { 176 .then((HttpResponse response) {
146 if(response.statusCode == HttpStatus.MOVED_PERMANENTLY || 177 if(response.statusCode == HttpStatus.MOVED_PERMANENTLY ||
147 response.statusCode == HttpStatus.MOVED_TEMPORARILY) { 178 response.statusCode == HttpStatus.MOVED_TEMPORARILY) {
(...skipping 12 matching lines...) Expand all
160 HttpServer server; 191 HttpServer server;
161 return HttpServer.bind('localhost', 0) 192 return HttpServer.bind('localhost', 0)
162 .then((value) { 193 .then((value) {
163 server = value; 194 server = value;
164 virDir.serve(server); 195 virDir.serve(server);
165 return func(server.port); 196 return func(server.port);
166 }) 197 })
167 .whenComplete(() => server.close()); 198 .whenComplete(() => server.close());
168 } 199 }
169 200
170 Future<HttpHeaders> _getHeaders(int port, String path) => 201 Future<HttpHeaders> _getHeaders(int port, String path, int from, int to) =>
171 new HttpClient() 202 new HttpClient()
kustermann 2014/11/14 13:25:27 Who is closing HttpClient here?
Søren Gjesse 2014/11/14 15:27:29 Nobody. Added close.
172 .get('localhost', port, path) 203 .get('localhost', port, path)
173 .then((request) => request.close()) 204 .then((request) {
205 _addRangeHeader(request, from, to);
206 return request.close();
207 })
174 .then((response) => response.drain().then( 208 .then((response) => response.drain().then(
175 (_) => response.headers)); 209 (_) => response.headers));
176 210
177 Future<String> _getAsString(int port, String path) => 211 Future<String> _getAsString(int port, String path) =>
178 new HttpClient() 212 new HttpClient()
kustermann 2014/11/14 13:25:27 ditto.
Søren Gjesse 2014/11/14 15:27:29 Ditto.
179 .get('localhost', port, path) 213 .get('localhost', port, path)
180 .then((request) => request.close()) 214 .then((request) => request.close())
181 .then((response) => UTF8.decodeStream(response)); 215 .then((response) => UTF8.decodeStream(response));
182 216
217 Future<List<int>> _getAsBytes(int port, String path, int from, int to) =>
218 new HttpClient()
kustermann 2014/11/14 13:25:27 ditto
Søren Gjesse 2014/11/14 15:27:29 Ditto.
219 .get('localhost', port, path)
220 .then((request) {
221 _addRangeHeader(request, from, to);
222 return request.close();
223 })
224 .then((response) => response.fold([], (p, e) => p..addAll(e)));
225
183 Uri _getUri(int port, 226 Uri _getUri(int port,
184 String path, 227 String path,
185 {bool secure: false, 228 {bool secure: false,
186 bool rawPath: false}) { 229 bool rawPath: false}) {
187 if (rawPath) { 230 if (rawPath) {
188 return new Uri(scheme: secure ? 'https' : 'http', 231 return new Uri(scheme: secure ? 'https' : 'http',
189 host: 'localhost', 232 host: 'localhost',
190 port: port, 233 port: port,
191 path: path); 234 path: path);
192 } else { 235 } else {
193 return (secure ? 236 return (secure ?
194 new Uri.https('localhost:$port', path) : 237 new Uri.https('localhost:$port', path) :
195 new Uri.http('localhost:$port', path)); 238 new Uri.http('localhost:$port', path));
196 } 239 }
197 } 240 }
198 241
242 void _addRangeHeader(HttpRequest request, int from, int to) {
243 var fromStr = from != null ? '$from' : '';
244 var toStr = to != null ? '$to' : '';
245 if (fromStr.isNotEmpty || toStr.isNotEmpty) {
246 request.headers.set(HttpHeaders.RANGE, 'bytes=$fromStr-$toStr');
247 }
248 }
249
199 const CERTIFICATE = "localhost_cert"; 250 const CERTIFICATE = "localhost_cert";
200 251
201 252
202 void setupSecure() { 253 void setupSecure() {
203 String certificateDatabase = Platform.script.resolve('pkcert').toFilePath(); 254 String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
204 SecureSocket.initialize(database: certificateDatabase, 255 SecureSocket.initialize(database: certificateDatabase,
205 password: 'dartdart'); 256 password: 'dartdart');
206 } 257 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698