| OLD | NEW |
| 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:io'; | 6 import 'dart:io'; |
| 7 | 7 |
| 8 import "package:http_server/http_server.dart"; | 8 import "package:http_server/http_server.dart"; |
| 9 import "package:path/path.dart"; | 9 import "package:path/path.dart"; |
| 10 import "package:unittest/unittest.dart"; | 10 import "package:unittest/unittest.dart"; |
| 11 | 11 |
| 12 import 'utils.dart'; | 12 import 'utils.dart'; |
| 13 | 13 |
| 14 | 14 |
| 15 void main() { | 15 void main() { |
| 16 group('serve-root', () { | 16 group('serve-root', () { |
| 17 test('dir-exists', () { | 17 test('dir-exists', () { |
| 18 expect(HttpServer.bind('localhost', 0).then((server) { | 18 expect(HttpServer.bind('localhost', 0).then((server) { |
| 19 var dir = new Directory('').createTempSync(); | 19 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 20 var virDir = new VirtualDirectory(dir.path); | 20 var virDir = new VirtualDirectory(dir.path); |
| 21 | 21 |
| 22 virDir.serve(server); | 22 virDir.serve(server); |
| 23 | 23 |
| 24 return getStatusCode(server.port, '/') | 24 return getStatusCode(server.port, '/') |
| 25 .whenComplete(() { | 25 .whenComplete(() { |
| 26 server.close(); | 26 server.close(); |
| 27 dir.deleteSync(); | 27 dir.deleteSync(); |
| 28 }); | 28 }); |
| 29 }), completion(equals(HttpStatus.NOT_FOUND))); | 29 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 30 }); | 30 }); |
| 31 | 31 |
| 32 test('dir-not-exists', () { | 32 test('dir-not-exists', () { |
| 33 expect(HttpServer.bind('localhost', 0).then((server) { | 33 expect(HttpServer.bind('localhost', 0).then((server) { |
| 34 var dir = new Directory('').createTempSync(); | 34 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 35 dir.deleteSync(); | 35 dir.deleteSync(); |
| 36 var virDir = new VirtualDirectory(dir.path); | 36 var virDir = new VirtualDirectory(dir.path); |
| 37 | 37 |
| 38 virDir.serve(server); | 38 virDir.serve(server); |
| 39 | 39 |
| 40 return getStatusCode(server.port, '/') | 40 return getStatusCode(server.port, '/') |
| 41 .whenComplete(() { | 41 .whenComplete(() { |
| 42 server.close(); | 42 server.close(); |
| 43 }); | 43 }); |
| 44 }), completion(equals(HttpStatus.NOT_FOUND))); | 44 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 45 }); | 45 }); |
| 46 }); | 46 }); |
| 47 | 47 |
| 48 group('serve-file', () { | 48 group('serve-file', () { |
| 49 group('top-level', () { | 49 group('top-level', () { |
| 50 test('file-exists', () { | 50 test('file-exists', () { |
| 51 expect(HttpServer.bind('localhost', 0).then((server) { | 51 expect(HttpServer.bind('localhost', 0).then((server) { |
| 52 var dir = new Directory('').createTempSync(); | 52 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 53 var file = new File('${dir.path}/file')..createSync(); | 53 var file = new File('${dir.path}/file')..createSync(); |
| 54 var virDir = new VirtualDirectory(dir.path); | 54 var virDir = new VirtualDirectory(dir.path); |
| 55 | 55 |
| 56 virDir.serve(server); | 56 virDir.serve(server); |
| 57 | 57 |
| 58 return getStatusCode(server.port, '/file') | 58 return getStatusCode(server.port, '/file') |
| 59 .whenComplete(() { | 59 .whenComplete(() { |
| 60 server.close(); | 60 server.close(); |
| 61 dir.deleteSync(recursive: true); | 61 dir.deleteSync(recursive: true); |
| 62 }); | 62 }); |
| 63 }), completion(equals(HttpStatus.OK))); | 63 }), completion(equals(HttpStatus.OK))); |
| 64 }); | 64 }); |
| 65 | 65 |
| 66 test('file-not-exists', () { | 66 test('file-not-exists', () { |
| 67 expect(HttpServer.bind('localhost', 0).then((server) { | 67 expect(HttpServer.bind('localhost', 0).then((server) { |
| 68 var dir = new Directory('').createTempSync(); | 68 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 69 var virDir = new VirtualDirectory(dir.path); | 69 var virDir = new VirtualDirectory(dir.path); |
| 70 | 70 |
| 71 virDir.serve(server); | 71 virDir.serve(server); |
| 72 | 72 |
| 73 return getStatusCode(server.port, '/file') | 73 return getStatusCode(server.port, '/file') |
| 74 .whenComplete(() { | 74 .whenComplete(() { |
| 75 server.close(); | 75 server.close(); |
| 76 dir.deleteSync(); | 76 dir.deleteSync(); |
| 77 }); | 77 }); |
| 78 }), completion(equals(HttpStatus.NOT_FOUND))); | 78 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 79 }); | 79 }); |
| 80 }); | 80 }); |
| 81 | 81 |
| 82 group('in-dir', () { | 82 group('in-dir', () { |
| 83 test('file-exists', () { | 83 test('file-exists', () { |
| 84 expect(HttpServer.bind('localhost', 0).then((server) { | 84 expect(HttpServer.bind('localhost', 0).then((server) { |
| 85 var dir = new Directory('').createTempSync(); | 85 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 86 var dir2 = new Directory('${dir.path}/dir')..createSync(); | 86 var dir2 = new Directory('${dir.path}/dir')..createSync(); |
| 87 var file = new File('${dir2.path}/file')..createSync(); | 87 var file = new File('${dir2.path}/file')..createSync(); |
| 88 var virDir = new VirtualDirectory(dir.path); | 88 var virDir = new VirtualDirectory(dir.path); |
| 89 | 89 |
| 90 virDir.serve(server); | 90 virDir.serve(server); |
| 91 | 91 |
| 92 return getStatusCode(server.port, '/dir/file') | 92 return getStatusCode(server.port, '/dir/file') |
| 93 .whenComplete(() { | 93 .whenComplete(() { |
| 94 server.close(); | 94 server.close(); |
| 95 dir.deleteSync(recursive: true); | 95 dir.deleteSync(recursive: true); |
| 96 }); | 96 }); |
| 97 }), completion(equals(HttpStatus.OK))); | 97 }), completion(equals(HttpStatus.OK))); |
| 98 }); | 98 }); |
| 99 | 99 |
| 100 test('file-not-exists', () { | 100 test('file-not-exists', () { |
| 101 expect(HttpServer.bind('localhost', 0).then((server) { | 101 expect(HttpServer.bind('localhost', 0).then((server) { |
| 102 var dir = new Directory('').createTempSync(); | 102 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 103 var dir2 = new Directory('${dir.path}/dir')..createSync(); | 103 var dir2 = new Directory('${dir.path}/dir')..createSync(); |
| 104 var file = new File('${dir.path}/file')..createSync(); | 104 var file = new File('${dir.path}/file')..createSync(); |
| 105 var virDir = new VirtualDirectory(dir.path); | 105 var virDir = new VirtualDirectory(dir.path); |
| 106 | 106 |
| 107 virDir.serve(server); | 107 virDir.serve(server); |
| 108 | 108 |
| 109 return getStatusCode(server.port, '/dir/file') | 109 return getStatusCode(server.port, '/dir/file') |
| 110 .whenComplete(() { | 110 .whenComplete(() { |
| 111 server.close(); | 111 server.close(); |
| 112 dir.deleteSync(recursive: true); | 112 dir.deleteSync(recursive: true); |
| 113 }); | 113 }); |
| 114 }), completion(equals(HttpStatus.NOT_FOUND))); | 114 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 115 }); | 115 }); |
| 116 }); | 116 }); |
| 117 }); | 117 }); |
| 118 | 118 |
| 119 group('serve-dir', () { | 119 group('serve-dir', () { |
| 120 group('top-level', () { | 120 group('top-level', () { |
| 121 test('simple', () { | 121 test('simple', () { |
| 122 expect(HttpServer.bind('localhost', 0).then((server) { | 122 expect(HttpServer.bind('localhost', 0).then((server) { |
| 123 var dir = new Directory('').createTempSync(); | 123 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 124 var virDir = new VirtualDirectory(dir.path); | 124 var virDir = new VirtualDirectory(dir.path); |
| 125 virDir.allowDirectoryListing = true; | 125 virDir.allowDirectoryListing = true; |
| 126 | 126 |
| 127 virDir.serve(server); | 127 virDir.serve(server); |
| 128 | 128 |
| 129 return getAsString(server.port, '/') | 129 return getAsString(server.port, '/') |
| 130 .whenComplete(() { | 130 .whenComplete(() { |
| 131 server.close(); | 131 server.close(); |
| 132 dir.deleteSync(); | 132 dir.deleteSync(); |
| 133 }); | 133 }); |
| 134 }), completion(contains('Index of /'))); | 134 }), completion(contains('Index of /'))); |
| 135 }); | 135 }); |
| 136 | 136 |
| 137 test('files', () { | 137 test('files', () { |
| 138 expect(HttpServer.bind('localhost', 0).then((server) { | 138 expect(HttpServer.bind('localhost', 0).then((server) { |
| 139 var dir = new Directory('').createTempSync(); | 139 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 140 var virDir = new VirtualDirectory(dir.path); | 140 var virDir = new VirtualDirectory(dir.path); |
| 141 for (int i = 0; i < 10; i++) { | 141 for (int i = 0; i < 10; i++) { |
| 142 new File('${dir.path}/$i').createSync(); | 142 new File('${dir.path}/$i').createSync(); |
| 143 } | 143 } |
| 144 virDir.allowDirectoryListing = true; | 144 virDir.allowDirectoryListing = true; |
| 145 | 145 |
| 146 virDir.serve(server); | 146 virDir.serve(server); |
| 147 | 147 |
| 148 return getAsString(server.port, '/') | 148 return getAsString(server.port, '/') |
| 149 .whenComplete(() { | 149 .whenComplete(() { |
| 150 server.close(); | 150 server.close(); |
| 151 dir.deleteSync(recursive: true); | 151 dir.deleteSync(recursive: true); |
| 152 }); | 152 }); |
| 153 }), completion(contains('Index of /'))); | 153 }), completion(contains('Index of /'))); |
| 154 }); | 154 }); |
| 155 | 155 |
| 156 test('dirs', () { | 156 test('dirs', () { |
| 157 expect(HttpServer.bind('localhost', 0).then((server) { | 157 expect(HttpServer.bind('localhost', 0).then((server) { |
| 158 var dir = new Directory('').createTempSync(); | 158 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 159 var virDir = new VirtualDirectory(dir.path); | 159 var virDir = new VirtualDirectory(dir.path); |
| 160 for (int i = 0; i < 10; i++) { | 160 for (int i = 0; i < 10; i++) { |
| 161 new Directory('${dir.path}/$i').createSync(); | 161 new Directory('${dir.path}/$i').createSync(); |
| 162 } | 162 } |
| 163 virDir.allowDirectoryListing = true; | 163 virDir.allowDirectoryListing = true; |
| 164 | 164 |
| 165 virDir.serve(server); | 165 virDir.serve(server); |
| 166 | 166 |
| 167 return getAsString(server.port, '/') | 167 return getAsString(server.port, '/') |
| 168 .whenComplete(() { | 168 .whenComplete(() { |
| 169 server.close(); | 169 server.close(); |
| 170 dir.deleteSync(recursive: true); | 170 dir.deleteSync(recursive: true); |
| 171 }); | 171 }); |
| 172 }), completion(contains('Index of /'))); | 172 }), completion(contains('Index of /'))); |
| 173 }); | 173 }); |
| 174 | 174 |
| 175 if (!Platform.isWindows) { | 175 if (!Platform.isWindows) { |
| 176 test('recursive-link', () { | 176 test('recursive-link', () { |
| 177 expect(HttpServer.bind('localhost', 0).then((server) { | 177 expect(HttpServer.bind('localhost', 0).then((server) { |
| 178 var dir = new Directory('').createTempSync(); | 178 var dir = |
| 179 Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 179 var link = new Link('${dir.path}/recursive')..createSync('.'); | 180 var link = new Link('${dir.path}/recursive')..createSync('.'); |
| 180 var virDir = new VirtualDirectory(dir.path); | 181 var virDir = new VirtualDirectory(dir.path); |
| 181 virDir.allowDirectoryListing = true; | 182 virDir.allowDirectoryListing = true; |
| 182 | 183 |
| 183 virDir.serve(server); | 184 virDir.serve(server); |
| 184 | 185 |
| 185 return Future.wait([ | 186 return Future.wait([ |
| 186 getAsString(server.port, '/').then( | 187 getAsString(server.port, '/').then( |
| 187 (s) => s.contains('recursive/')), | 188 (s) => s.contains('recursive/')), |
| 188 getAsString(server.port, '/').then( | 189 getAsString(server.port, '/').then( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 200 dir.deleteSync(recursive: true); | 201 dir.deleteSync(recursive: true); |
| 201 }); | 202 }); |
| 202 }), completion(equals([true, true, true, true, true, true]))); | 203 }), completion(equals([true, true, true, true, true, true]))); |
| 203 }); | 204 }); |
| 204 } | 205 } |
| 205 }); | 206 }); |
| 206 | 207 |
| 207 group('custom', () { | 208 group('custom', () { |
| 208 test('simple', () { | 209 test('simple', () { |
| 209 expect(HttpServer.bind('localhost', 0).then((server) { | 210 expect(HttpServer.bind('localhost', 0).then((server) { |
| 210 var dir = new Directory('').createTempSync(); | 211 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 211 var virDir = new VirtualDirectory(dir.path); | 212 var virDir = new VirtualDirectory(dir.path); |
| 212 virDir.allowDirectoryListing = true; | 213 virDir.allowDirectoryListing = true; |
| 213 virDir.setDirectoryHandler((dir2, request) { | 214 virDir.setDirectoryHandler((dir2, request) { |
| 214 expect(dir2, isNotNull); | 215 expect(dir2, isNotNull); |
| 215 expect(FileSystemEntity.identicalSync(dir.path, dir2.path), isTrue); | 216 expect(FileSystemEntity.identicalSync(dir.path, dir2.path), isTrue); |
| 216 request.response.write('My handler ${request.uri.path}'); | 217 request.response.write('My handler ${request.uri.path}'); |
| 217 request.response.close(); | 218 request.response.close(); |
| 218 }); | 219 }); |
| 219 | 220 |
| 220 virDir.serve(server); | 221 virDir.serve(server); |
| 221 | 222 |
| 222 return getAsString(server.port, '/') | 223 return getAsString(server.port, '/') |
| 223 .whenComplete(() { | 224 .whenComplete(() { |
| 224 server.close(); | 225 server.close(); |
| 225 dir.deleteSync(); | 226 dir.deleteSync(); |
| 226 }); | 227 }); |
| 227 }), completion(contains('My handler /'))); | 228 }), completion(contains('My handler /'))); |
| 228 }); | 229 }); |
| 229 }); | 230 }); |
| 230 }); | 231 }); |
| 231 | 232 |
| 232 group('links', () { | 233 group('links', () { |
| 233 if (!Platform.isWindows) { | 234 if (!Platform.isWindows) { |
| 234 group('follow-links', () { | 235 group('follow-links', () { |
| 235 test('dir-link', () { | 236 test('dir-link', () { |
| 236 expect(HttpServer.bind('localhost', 0).then((server) { | 237 expect(HttpServer.bind('localhost', 0).then((server) { |
| 237 var dir = new Directory('').createTempSync(); | 238 var dir = |
| 239 Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 238 var dir2 = new Directory('${dir.path}/dir2')..createSync(); | 240 var dir2 = new Directory('${dir.path}/dir2')..createSync(); |
| 239 var link = new Link('${dir.path}/dir3')..createSync('dir2'); | 241 var link = new Link('${dir.path}/dir3')..createSync('dir2'); |
| 240 var file = new File('${dir2.path}/file')..createSync(); | 242 var file = new File('${dir2.path}/file')..createSync(); |
| 241 var virDir = new VirtualDirectory(dir.path); | 243 var virDir = new VirtualDirectory(dir.path); |
| 242 virDir.followLinks = true; | 244 virDir.followLinks = true; |
| 243 | 245 |
| 244 virDir.serve(server); | 246 virDir.serve(server); |
| 245 | 247 |
| 246 return getStatusCode(server.port, '/dir3/file') | 248 return getStatusCode(server.port, '/dir3/file') |
| 247 .whenComplete(() { | 249 .whenComplete(() { |
| 248 server.close(); | 250 server.close(); |
| 249 dir.deleteSync(recursive: true); | 251 dir.deleteSync(recursive: true); |
| 250 }); | 252 }); |
| 251 }), completion(equals(HttpStatus.OK))); | 253 }), completion(equals(HttpStatus.OK))); |
| 252 }); | 254 }); |
| 253 | 255 |
| 254 test('root-link', () { | 256 test('root-link', () { |
| 255 expect(HttpServer.bind('localhost', 0).then((server) { | 257 expect(HttpServer.bind('localhost', 0).then((server) { |
| 256 var dir = new Directory('').createTempSync(); | 258 var dir = |
| 259 Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 257 var link = new Link('${dir.path}/dir3')..createSync('.'); | 260 var link = new Link('${dir.path}/dir3')..createSync('.'); |
| 258 var file = new File('${dir.path}/file')..createSync(); | 261 var file = new File('${dir.path}/file')..createSync(); |
| 259 var virDir = new VirtualDirectory(dir.path); | 262 var virDir = new VirtualDirectory(dir.path); |
| 260 virDir.followLinks = true; | 263 virDir.followLinks = true; |
| 261 | 264 |
| 262 virDir.serve(server); | 265 virDir.serve(server); |
| 263 | 266 |
| 264 return getStatusCode(server.port, '/dir3/file') | 267 return getStatusCode(server.port, '/dir3/file') |
| 265 .whenComplete(() { | 268 .whenComplete(() { |
| 266 server.close(); | 269 server.close(); |
| 267 dir.deleteSync(recursive: true); | 270 dir.deleteSync(recursive: true); |
| 268 }); | 271 }); |
| 269 }), completion(equals(HttpStatus.OK))); | 272 }), completion(equals(HttpStatus.OK))); |
| 270 }); | 273 }); |
| 271 | 274 |
| 272 group('bad-links', () { | 275 group('bad-links', () { |
| 273 test('absolute-link', () { | 276 test('absolute-link', () { |
| 274 expect(HttpServer.bind('localhost', 0).then((server) { | 277 expect(HttpServer.bind('localhost', 0).then((server) { |
| 275 var dir = new Directory('').createTempSync(); | 278 var dir = |
| 279 Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 276 var file = new File('${dir.path}/file')..createSync(); | 280 var file = new File('${dir.path}/file')..createSync(); |
| 277 var link = new Link('${dir.path}/dir3') | 281 var link = new Link('${dir.path}/dir3') |
| 278 ..createSync('${dir.path}/file'); | 282 ..createSync('${dir.path}/file'); |
| 279 var virDir = new VirtualDirectory(dir.path); | 283 var virDir = new VirtualDirectory(dir.path); |
| 280 virDir.followLinks = true; | 284 virDir.followLinks = true; |
| 281 | 285 |
| 282 virDir.serve(server); | 286 virDir.serve(server); |
| 283 | 287 |
| 284 return new HttpClient().get('localhost', | 288 return new HttpClient().get('localhost', |
| 285 server.port, | 289 server.port, |
| 286 '/dir3/file') | 290 '/dir3/file') |
| 287 .then((request) => request.close()) | 291 .then((request) => request.close()) |
| 288 .then((response) => response.drain().then( | 292 .then((response) => response.drain().then( |
| 289 (_) => response.statusCode)) | 293 (_) => response.statusCode)) |
| 290 .whenComplete(() { | 294 .whenComplete(() { |
| 291 server.close(); | 295 server.close(); |
| 292 dir.deleteSync(recursive: true); | 296 dir.deleteSync(recursive: true); |
| 293 }); | 297 }); |
| 294 }), completion(equals(HttpStatus.NOT_FOUND))); | 298 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 295 }); | 299 }); |
| 296 | 300 |
| 297 test('relative-parent-link', () { | 301 test('relative-parent-link', () { |
| 298 expect(HttpServer.bind('localhost', 0).then((server) { | 302 expect(HttpServer.bind('localhost', 0).then((server) { |
| 299 var dir = new Directory('').createTempSync(); | 303 var dir = |
| 304 Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 300 var name = basename(dir.path); | 305 var name = basename(dir.path); |
| 301 var file = new File('${dir.path}/file')..createSync(); | 306 var file = new File('${dir.path}/file')..createSync(); |
| 302 var link = new Link('${dir.path}/dir3') | 307 var link = new Link('${dir.path}/dir3') |
| 303 ..createSync('../$name/file'); | 308 ..createSync('../$name/file'); |
| 304 var virDir = new VirtualDirectory(dir.path); | 309 var virDir = new VirtualDirectory(dir.path); |
| 305 virDir.followLinks = true; | 310 virDir.followLinks = true; |
| 306 | 311 |
| 307 virDir.serve(server); | 312 virDir.serve(server); |
| 308 | 313 |
| 309 return new HttpClient().get('localhost', | 314 return new HttpClient().get('localhost', |
| 310 server.port, | 315 server.port, |
| 311 '/dir3/file') | 316 '/dir3/file') |
| 312 .then((request) => request.close()) | 317 .then((request) => request.close()) |
| 313 .then((response) => response.drain().then( | 318 .then((response) => response.drain().then( |
| 314 (_) => response.statusCode)) | 319 (_) => response.statusCode)) |
| 315 .whenComplete(() { | 320 .whenComplete(() { |
| 316 server.close(); | 321 server.close(); |
| 317 dir.deleteSync(recursive: true); | 322 dir.deleteSync(recursive: true); |
| 318 }); | 323 }); |
| 319 }), completion(equals(HttpStatus.NOT_FOUND))); | 324 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 320 }); | 325 }); |
| 321 }); | 326 }); |
| 322 }); | 327 }); |
| 323 | 328 |
| 324 group('not-follow-links', () { | 329 group('not-follow-links', () { |
| 325 test('dir-link', () { | 330 test('dir-link', () { |
| 326 expect(HttpServer.bind('localhost', 0).then((server) { | 331 expect(HttpServer.bind('localhost', 0).then((server) { |
| 327 var dir = new Directory('').createTempSync(); | 332 var dir = |
| 333 Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 328 var dir2 = new Directory('${dir.path}/dir2')..createSync(); | 334 var dir2 = new Directory('${dir.path}/dir2')..createSync(); |
| 329 var link = new Link('${dir.path}/dir3')..createSync('dir2'); | 335 var link = new Link('${dir.path}/dir3')..createSync('dir2'); |
| 330 var file = new File('${dir2.path}/file')..createSync(); | 336 var file = new File('${dir2.path}/file')..createSync(); |
| 331 var virDir = new VirtualDirectory(dir.path); | 337 var virDir = new VirtualDirectory(dir.path); |
| 332 virDir.followLinks = false; | 338 virDir.followLinks = false; |
| 333 | 339 |
| 334 virDir.serve(server); | 340 virDir.serve(server); |
| 335 | 341 |
| 336 return getStatusCode(server.port, '/dir3/file') | 342 return getStatusCode(server.port, '/dir3/file') |
| 337 .whenComplete(() { | 343 .whenComplete(() { |
| 338 server.close(); | 344 server.close(); |
| 339 dir.deleteSync(recursive: true); | 345 dir.deleteSync(recursive: true); |
| 340 }); | 346 }); |
| 341 }), completion(equals(HttpStatus.NOT_FOUND))); | 347 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 342 }); | 348 }); |
| 343 }); | 349 }); |
| 344 } | 350 } |
| 345 }); | 351 }); |
| 346 | 352 |
| 347 group('last-modified', () { | 353 group('last-modified', () { |
| 348 group('file', () { | 354 group('file', () { |
| 349 test('file-exists', () { | 355 test('file-exists', () { |
| 350 expect(HttpServer.bind('localhost', 0).then((server) { | 356 expect(HttpServer.bind('localhost', 0).then((server) { |
| 351 var dir = new Directory('').createTempSync(); | 357 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 352 var file = new File('${dir.path}/file')..createSync(); | 358 var file = new File('${dir.path}/file')..createSync(); |
| 353 var virDir = new VirtualDirectory(dir.path); | 359 var virDir = new VirtualDirectory(dir.path); |
| 354 | 360 |
| 355 virDir.serve(server); | 361 virDir.serve(server); |
| 356 | 362 |
| 357 return getHeaders(server.port, '/file') | 363 return getHeaders(server.port, '/file') |
| 358 .then((headers) { | 364 .then((headers) { |
| 359 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); | 365 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); |
| 360 return HttpDate.parse( | 366 return HttpDate.parse( |
| 361 headers.value(HttpHeaders.LAST_MODIFIED)); | 367 headers.value(HttpHeaders.LAST_MODIFIED)); |
| 362 }) | 368 }) |
| 363 .then((lastModified) { | 369 .then((lastModified) { |
| 364 return getStatusCode( | 370 return getStatusCode( |
| 365 server.port, '/file', ifModifiedSince: lastModified); | 371 server.port, '/file', ifModifiedSince: lastModified); |
| 366 }) | 372 }) |
| 367 .whenComplete(() { | 373 .whenComplete(() { |
| 368 server.close(); | 374 server.close(); |
| 369 dir.deleteSync(recursive: true); | 375 dir.deleteSync(recursive: true); |
| 370 }); | 376 }); |
| 371 }), completion(equals(HttpStatus.NOT_MODIFIED))); | 377 }), completion(equals(HttpStatus.NOT_MODIFIED))); |
| 372 }); | 378 }); |
| 373 | 379 |
| 374 test('file-changes', () { | 380 test('file-changes', () { |
| 375 expect(HttpServer.bind('localhost', 0).then((server) { | 381 expect(HttpServer.bind('localhost', 0).then((server) { |
| 376 var dir = new Directory('').createTempSync(); | 382 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 377 var file = new File('${dir.path}/file')..createSync(); | 383 var file = new File('${dir.path}/file')..createSync(); |
| 378 var virDir = new VirtualDirectory(dir.path); | 384 var virDir = new VirtualDirectory(dir.path); |
| 379 | 385 |
| 380 virDir.serve(server); | 386 virDir.serve(server); |
| 381 | 387 |
| 382 return getHeaders(server.port, '/file') | 388 return getHeaders(server.port, '/file') |
| 383 .then((headers) { | 389 .then((headers) { |
| 384 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); | 390 expect(headers.value(HttpHeaders.LAST_MODIFIED), isNotNull); |
| 385 return HttpDate.parse( | 391 return HttpDate.parse( |
| 386 headers.value(HttpHeaders.LAST_MODIFIED)); | 392 headers.value(HttpHeaders.LAST_MODIFIED)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 398 }); | 404 }); |
| 399 }), completion(equals(HttpStatus.OK))); | 405 }), completion(equals(HttpStatus.OK))); |
| 400 }); | 406 }); |
| 401 }); | 407 }); |
| 402 }); | 408 }); |
| 403 | 409 |
| 404 group('content-type', () { | 410 group('content-type', () { |
| 405 group('mime-type', () { | 411 group('mime-type', () { |
| 406 test('from-path', () { | 412 test('from-path', () { |
| 407 expect(HttpServer.bind('localhost', 0).then((server) { | 413 expect(HttpServer.bind('localhost', 0).then((server) { |
| 408 var dir = new Directory('').createTempSync(); | 414 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 409 var file = new File('${dir.path}/file.jpg')..createSync(); | 415 var file = new File('${dir.path}/file.jpg')..createSync(); |
| 410 var virDir = new VirtualDirectory(dir.path); | 416 var virDir = new VirtualDirectory(dir.path); |
| 411 | 417 |
| 412 virDir.serve(server); | 418 virDir.serve(server); |
| 413 | 419 |
| 414 return getHeaders(server.port, '/file.jpg') | 420 return getHeaders(server.port, '/file.jpg') |
| 415 .then((headers) => headers.contentType.toString()) | 421 .then((headers) => headers.contentType.toString()) |
| 416 .whenComplete(() { | 422 .whenComplete(() { |
| 417 server.close(); | 423 server.close(); |
| 418 dir.deleteSync(recursive: true); | 424 dir.deleteSync(recursive: true); |
| 419 }); | 425 }); |
| 420 }), completion(equals('image/jpeg'))); | 426 }), completion(equals('image/jpeg'))); |
| 421 }); | 427 }); |
| 422 | 428 |
| 423 test('from-magic-number', () { | 429 test('from-magic-number', () { |
| 424 expect(HttpServer.bind('localhost', 0).then((server) { | 430 expect(HttpServer.bind('localhost', 0).then((server) { |
| 425 var dir = new Directory('').createTempSync(); | 431 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 426 var file = new File('${dir.path}/file.jpg')..createSync(); | 432 var file = new File('${dir.path}/file.jpg')..createSync(); |
| 427 file.writeAsBytesSync( | 433 file.writeAsBytesSync( |
| 428 [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); | 434 [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]); |
| 429 var virDir = new VirtualDirectory(dir.path); | 435 var virDir = new VirtualDirectory(dir.path); |
| 430 | 436 |
| 431 virDir.serve(server); | 437 virDir.serve(server); |
| 432 | 438 |
| 433 return getHeaders(server.port, '/file.jpg') | 439 return getHeaders(server.port, '/file.jpg') |
| 434 .then((headers) => headers.contentType.toString()) | 440 .then((headers) => headers.contentType.toString()) |
| 435 .whenComplete(() { | 441 .whenComplete(() { |
| 436 server.close(); | 442 server.close(); |
| 437 dir.deleteSync(recursive: true); | 443 dir.deleteSync(recursive: true); |
| 438 }); | 444 }); |
| 439 }), completion(equals('image/png'))); | 445 }), completion(equals('image/png'))); |
| 440 }); | 446 }); |
| 441 }); | 447 }); |
| 442 }); | 448 }); |
| 443 | 449 |
| 444 group('error-page', () { | 450 group('error-page', () { |
| 445 test('default', () { | 451 test('default', () { |
| 446 expect(HttpServer.bind('localhost', 0).then((server) { | 452 expect(HttpServer.bind('localhost', 0).then((server) { |
| 447 var dir = new Directory('').createTempSync(); | 453 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 448 var virDir = new VirtualDirectory(dir.path); | 454 var virDir = new VirtualDirectory(dir.path); |
| 449 dir.deleteSync(); | 455 dir.deleteSync(); |
| 450 | 456 |
| 451 virDir.serve(server); | 457 virDir.serve(server); |
| 452 | 458 |
| 453 return getAsString(server.port, '/') | 459 return getAsString(server.port, '/') |
| 454 .whenComplete(() { | 460 .whenComplete(() { |
| 455 server.close(); | 461 server.close(); |
| 456 }); | 462 }); |
| 457 }), completion(matches(new RegExp('404.*Not Found')))); | 463 }), completion(matches(new RegExp('404.*Not Found')))); |
| 458 }); | 464 }); |
| 459 | 465 |
| 460 test('custom', () { | 466 test('custom', () { |
| 461 expect(HttpServer.bind('localhost', 0).then((server) { | 467 expect(HttpServer.bind('localhost', 0).then((server) { |
| 462 var dir = new Directory('').createTempSync(); | 468 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 463 var virDir = new VirtualDirectory(dir.path); | 469 var virDir = new VirtualDirectory(dir.path); |
| 464 dir.deleteSync(); | 470 dir.deleteSync(); |
| 465 | 471 |
| 466 virDir.setErrorPageHandler((request) { | 472 virDir.setErrorPageHandler((request) { |
| 467 request.response.write('my-page '); | 473 request.response.write('my-page '); |
| 468 request.response.write(request.response.statusCode); | 474 request.response.write(request.response.statusCode); |
| 469 request.response.close(); | 475 request.response.close(); |
| 470 }); | 476 }); |
| 471 virDir.serve(server); | 477 virDir.serve(server); |
| 472 | 478 |
| 473 return getAsString(server.port, '/') | 479 return getAsString(server.port, '/') |
| 474 .whenComplete(() { | 480 .whenComplete(() { |
| 475 server.close(); | 481 server.close(); |
| 476 }); | 482 }); |
| 477 }), completion(equals('my-page 404'))); | 483 }), completion(equals('my-page 404'))); |
| 478 }); | 484 }); |
| 479 }); | 485 }); |
| 480 | 486 |
| 481 group('escape-root', () { | 487 group('escape-root', () { |
| 482 test('escape1', () { | 488 test('escape1', () { |
| 483 expect(HttpServer.bind('localhost', 0).then((server) { | 489 expect(HttpServer.bind('localhost', 0).then((server) { |
| 484 var dir = new Directory('').createTempSync(); | 490 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 485 var virDir = new VirtualDirectory(dir.path); | 491 var virDir = new VirtualDirectory(dir.path); |
| 486 virDir.allowDirectoryListing = true; | 492 virDir.allowDirectoryListing = true; |
| 487 | 493 |
| 488 virDir.serve(server); | 494 virDir.serve(server); |
| 489 | 495 |
| 490 return getStatusCode(server.port, '/../') | 496 return getStatusCode(server.port, '/../') |
| 491 .whenComplete(() { | 497 .whenComplete(() { |
| 492 server.close(); | 498 server.close(); |
| 493 dir.deleteSync(); | 499 dir.deleteSync(); |
| 494 }); | 500 }); |
| 495 }), completion(equals(HttpStatus.NOT_FOUND))); | 501 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 496 }); | 502 }); |
| 497 | 503 |
| 498 test('escape2', () { | 504 test('escape2', () { |
| 499 expect(HttpServer.bind('localhost', 0).then((server) { | 505 expect(HttpServer.bind('localhost', 0).then((server) { |
| 500 var dir = new Directory('').createTempSync(); | 506 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 501 new Directory('${dir.path}/dir').createSync(); | 507 new Directory('${dir.path}/dir').createSync(); |
| 502 var virDir = new VirtualDirectory(dir.path); | 508 var virDir = new VirtualDirectory(dir.path); |
| 503 virDir.allowDirectoryListing = true; | 509 virDir.allowDirectoryListing = true; |
| 504 | 510 |
| 505 virDir.serve(server); | 511 virDir.serve(server); |
| 506 | 512 |
| 507 return getStatusCode(server.port, '/dir/../../') | 513 return getStatusCode(server.port, '/dir/../../') |
| 508 .whenComplete(() { | 514 .whenComplete(() { |
| 509 server.close(); | 515 server.close(); |
| 510 dir.deleteSync(recursive: true); | 516 dir.deleteSync(recursive: true); |
| 511 }); | 517 }); |
| 512 }), completion(equals(HttpStatus.NOT_FOUND))); | 518 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 513 }); | 519 }); |
| 514 }); | 520 }); |
| 515 | 521 |
| 516 group('url-decode', () { | 522 group('url-decode', () { |
| 517 test('with-space', () { | 523 test('with-space', () { |
| 518 expect(HttpServer.bind('localhost', 0).then((server) { | 524 expect(HttpServer.bind('localhost', 0).then((server) { |
| 519 var dir = new Directory('').createTempSync(); | 525 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 520 var file = new File('${dir.path}/my file')..createSync(); | 526 var file = new File('${dir.path}/my file')..createSync(); |
| 521 var virDir = new VirtualDirectory(dir.path); | 527 var virDir = new VirtualDirectory(dir.path); |
| 522 | 528 |
| 523 virDir.serve(server); | 529 virDir.serve(server); |
| 524 | 530 |
| 525 return getStatusCode(server.port, '/my file') | 531 return getStatusCode(server.port, '/my file') |
| 526 .whenComplete(() { | 532 .whenComplete(() { |
| 527 server.close(); | 533 server.close(); |
| 528 dir.deleteSync(recursive: true); | 534 dir.deleteSync(recursive: true); |
| 529 }); | 535 }); |
| 530 }), completion(equals(HttpStatus.OK))); | 536 }), completion(equals(HttpStatus.OK))); |
| 531 }); | 537 }); |
| 532 | 538 |
| 533 test('encoded-space', () { | 539 test('encoded-space', () { |
| 534 expect(HttpServer.bind('localhost', 0).then((server) { | 540 expect(HttpServer.bind('localhost', 0).then((server) { |
| 535 var dir = new Directory('').createTempSync(); | 541 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 536 var file = new File('${dir.path}/my file')..createSync(); | 542 var file = new File('${dir.path}/my file')..createSync(); |
| 537 var virDir = new VirtualDirectory(dir.path); | 543 var virDir = new VirtualDirectory(dir.path); |
| 538 | 544 |
| 539 virDir.serve(server); | 545 virDir.serve(server); |
| 540 | 546 |
| 541 return getStatusCode(server.port, '/my%20file') | 547 return getStatusCode(server.port, '/my%20file') |
| 542 .whenComplete(() { | 548 .whenComplete(() { |
| 543 server.close(); | 549 server.close(); |
| 544 dir.deleteSync(recursive: true); | 550 dir.deleteSync(recursive: true); |
| 545 }); | 551 }); |
| 546 }), completion(equals(HttpStatus.NOT_FOUND))); | 552 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 547 }); | 553 }); |
| 548 | 554 |
| 549 test('encoded-path-separator', () { | 555 test('encoded-path-separator', () { |
| 550 expect(HttpServer.bind('localhost', 0).then((server) { | 556 expect(HttpServer.bind('localhost', 0).then((server) { |
| 551 var dir = new Directory('').createTempSync(); | 557 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 552 new Directory('${dir.path}/a').createSync(); | 558 new Directory('${dir.path}/a').createSync(); |
| 553 new Directory('${dir.path}/a/b').createSync(); | 559 new Directory('${dir.path}/a/b').createSync(); |
| 554 new Directory('${dir.path}/a/b/c').createSync(); | 560 new Directory('${dir.path}/a/b/c').createSync(); |
| 555 var virDir = new VirtualDirectory(dir.path); | 561 var virDir = new VirtualDirectory(dir.path); |
| 556 virDir.allowDirectoryListing = true; | 562 virDir.allowDirectoryListing = true; |
| 557 | 563 |
| 558 virDir.serve(server); | 564 virDir.serve(server); |
| 559 | 565 |
| 560 return getStatusCode(server.port, '/a%2fb/c', rawPath: true) | 566 return getStatusCode(server.port, '/a%2fb/c', rawPath: true) |
| 561 .whenComplete(() { | 567 .whenComplete(() { |
| 562 server.close(); | 568 server.close(); |
| 563 dir.deleteSync(recursive: true); | 569 dir.deleteSync(recursive: true); |
| 564 }); | 570 }); |
| 565 }), completion(equals(HttpStatus.NOT_FOUND))); | 571 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 566 }); | 572 }); |
| 567 | 573 |
| 568 test('encoded-null', () { | 574 test('encoded-null', () { |
| 569 expect(HttpServer.bind('localhost', 0).then((server) { | 575 expect(HttpServer.bind('localhost', 0).then((server) { |
| 570 var dir = new Directory('').createTempSync(); | 576 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 571 var virDir = new VirtualDirectory(dir.path); | 577 var virDir = new VirtualDirectory(dir.path); |
| 572 virDir.allowDirectoryListing = true; | 578 virDir.allowDirectoryListing = true; |
| 573 | 579 |
| 574 virDir.serve(server); | 580 virDir.serve(server); |
| 575 | 581 |
| 576 return getStatusCode(server.port, '/%00', rawPath: true) | 582 return getStatusCode(server.port, '/%00', rawPath: true) |
| 577 .whenComplete(() { | 583 .whenComplete(() { |
| 578 server.close(); | 584 server.close(); |
| 579 dir.deleteSync(recursive: true); | 585 dir.deleteSync(recursive: true); |
| 580 }); | 586 }); |
| 581 }), completion(equals(HttpStatus.NOT_FOUND))); | 587 }), completion(equals(HttpStatus.NOT_FOUND))); |
| 582 }); | 588 }); |
| 583 | 589 |
| 584 testEncoding(name, expected, [bool create = true]) { | 590 testEncoding(name, expected, [bool create = true]) { |
| 585 test('encode-$name', () { | 591 test('encode-$name', () { |
| 586 expect(HttpServer.bind('localhost', 0).then((server) { | 592 expect(HttpServer.bind('localhost', 0).then((server) { |
| 587 var dir = new Directory('').createTempSync(); | 593 var dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 588 if (create) new File('${dir.path}/$name').createSync(); | 594 if (create) new File('${dir.path}/$name').createSync(); |
| 589 var virDir = new VirtualDirectory(dir.path); | 595 var virDir = new VirtualDirectory(dir.path); |
| 590 virDir.allowDirectoryListing = true; | 596 virDir.allowDirectoryListing = true; |
| 591 | 597 |
| 592 virDir.serve(server); | 598 virDir.serve(server); |
| 593 | 599 |
| 594 return getStatusCode(server.port, '/$name') | 600 return getStatusCode(server.port, '/$name') |
| 595 .whenComplete(() { | 601 .whenComplete(() { |
| 596 server.close(); | 602 server.close(); |
| 597 dir.deleteSync(recursive: true); | 603 dir.deleteSync(recursive: true); |
| 598 }); | 604 }); |
| 599 }), completion(equals(expected))); | 605 }), completion(equals(expected))); |
| 600 }); | 606 }); |
| 601 } | 607 } |
| 602 testEncoding('..', HttpStatus.NOT_FOUND, false); | 608 testEncoding('..', HttpStatus.NOT_FOUND, false); |
| 603 testEncoding('%2e%2e', HttpStatus.OK); | 609 testEncoding('%2e%2e', HttpStatus.OK); |
| 604 testEncoding('%252e%252e', HttpStatus.OK); | 610 testEncoding('%252e%252e', HttpStatus.OK); |
| 605 testEncoding('/', HttpStatus.OK, false); | 611 testEncoding('/', HttpStatus.OK, false); |
| 606 testEncoding('%2f', HttpStatus.NOT_FOUND, false); | 612 testEncoding('%2f', HttpStatus.NOT_FOUND, false); |
| 607 testEncoding('%2f', HttpStatus.OK, true); | 613 testEncoding('%2f', HttpStatus.OK, true); |
| 608 }); | 614 }); |
| 609 } | 615 } |
| 610 | 616 |
| OLD | NEW |