| 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' as pathos; | 9 import 'package:path/path.dart' as pathos; |
| 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 void _testVirDir(String name, dynamic func(HttpServer server, Directory dir)) { | 14 void _testVirDir(String name, dynamic func(HttpServer server, Directory dir)) { |
| 15 test(name, () { | 15 test(name, () { |
| 16 HttpServer server; | 16 HttpServer server; |
| 17 Directory dir; | 17 Directory dir; |
| 18 | 18 |
| 19 return HttpServer.bind('localhost', 0) | 19 return HttpServer.bind('localhost', 0) |
| 20 .then((value) { | 20 .then((value) { |
| 21 server = value; | 21 server = value; |
| 22 dir = Directory.systemTemp.createTempSync('http_server_virtual_'); | 22 dir = Directory.systemTemp.createTempSync('http_server_virtual_'); |
| 23 return func(server, dir); | 23 return func(server, dir); |
| 24 }) | 24 }) |
| 25 .whenComplete(() { | 25 .whenComplete(() { |
| 26 return Future.wait([server.close(), dir.delete(recursive: true)]); | 26 return Future.wait([server.close(), dir.delete(recursive: true)]); |
| 27 }); | 27 }); |
| 28 }); | 28 }); |
| 29 } | 29 } |
| 30 | 30 |
| 31 void _testEncoding(name, expected, [bool create = true]) { | 31 void _testEncoding(name, expected, [bool create = true]) { |
| 32 _testVirDir('encode-$name', (server, dir) { | 32 _testVirDir('encode-$name', (server, dir) { |
| 33 if (create) new File('${dir.path}/$name').createSync(); | 33 if (create) new File('${dir.path}/$name').createSync(); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 expect(result, HttpStatus.NOT_FOUND); | 66 expect(result, HttpStatus.NOT_FOUND); |
| 67 }); | 67 }); |
| 68 }); | 68 }); |
| 69 }); | 69 }); |
| 70 | 70 |
| 71 group('serve-file', () { | 71 group('serve-file', () { |
| 72 group('top-level', () { | 72 group('top-level', () { |
| 73 _testVirDir('file-exists', (server, dir) { | 73 _testVirDir('file-exists', (server, dir) { |
| 74 var file = new File('${dir.path}/file')..createSync(); | 74 var file = new File('${dir.path}/file')..createSync(); |
| 75 var virDir = new VirtualDirectory(dir.path); | 75 var virDir = new VirtualDirectory(dir.path); |
| 76 | 76 |
| 77 virDir.serve(server); | 77 virDir.serve(server); |
| 78 | 78 |
| 79 return getStatusCode(server.port, '/file') | 79 return getStatusCode(server.port, '/file') |
| 80 .then((result) { | 80 .then((result) { |
| 81 expect(result, HttpStatus.OK); | 81 expect(result, HttpStatus.OK); |
| 82 }); | 82 }); |
| 83 }); | 83 }); |
| 84 | 84 |
| 85 _testVirDir('file-not-exists', (server, dir) { | 85 _testVirDir('file-not-exists', (server, dir) { |
| 86 var virDir = new VirtualDirectory(dir.path); | 86 var virDir = new VirtualDirectory(dir.path); |
| 87 | 87 |
| 88 virDir.serve(server); | 88 virDir.serve(server); |
| 89 | 89 |
| 90 return getStatusCode(server.port, '/file') | 90 return getStatusCode(server.port, '/file') |
| 91 .then((result) { | 91 .then((result) { |
| 92 expect(result, HttpStatus.NOT_FOUND); | 92 expect(result, HttpStatus.NOT_FOUND); |
| 93 }); | 93 }); |
| 94 }); | 94 }); |
| 95 }); | 95 }); |
| 96 | 96 |
| 97 group('in-dir', () { | 97 group('in-dir', () { |
| 98 _testVirDir('file-exists', (server, dir) { | 98 _testVirDir('file-exists', (server, dir) { |
| 99 var dir2 = new Directory('${dir.path}/dir')..createSync(); | 99 var dir2 = new Directory('${dir.path}/dir')..createSync(); |
| 100 var file = new File('${dir2.path}/file')..createSync(); | 100 var file = new File('${dir2.path}/file')..createSync(); |
| 101 var virDir = new VirtualDirectory(dir.path); | 101 var virDir = new VirtualDirectory(dir.path); |
| 102 | 102 |
| 103 virDir.serve(server); | 103 virDir.serve(server); |
| 104 | 104 |
| 105 return getStatusCode(server.port, '/dir/file') | 105 return getStatusCode(server.port, '/dir/file') |
| 106 .then((result) { | 106 .then((result) { |
| 107 expect(result, HttpStatus.OK); | 107 expect(result, HttpStatus.OK); |
| 108 }); | 108 }); |
| 109 }); | 109 }); |
| 110 | 110 |
| 111 _testVirDir('file-not-exists', (server, dir) { | 111 _testVirDir('file-not-exists', (server, dir) { |
| 112 var dir2 = new Directory('${dir.path}/dir')..createSync(); | 112 var dir2 = new Directory('${dir.path}/dir')..createSync(); |
| 113 var file = new File('${dir.path}/file')..createSync(); | 113 var file = new File('${dir.path}/file')..createSync(); |
| 114 var virDir = new VirtualDirectory(dir.path); | 114 var virDir = new VirtualDirectory(dir.path); |
| 115 | 115 |
| 116 virDir.serve(server); | 116 virDir.serve(server); |
| 117 | 117 |
| 118 return getStatusCode(server.port, '/dir/file') | 118 return getStatusCode(server.port, '/dir/file') |
| 119 .then((result) { | 119 .then((result) { |
| 120 expect(result, HttpStatus.NOT_FOUND); | 120 expect(result, HttpStatus.NOT_FOUND); |
| 121 }); | 121 }); |
| 122 }); | 122 }); |
| 123 }); | 123 }); |
| 124 }); | 124 }); |
| 125 | 125 |
| 126 group('serve-dir', () { | 126 group('serve-dir', () { |
| 127 group('top-level', () { | 127 group('top-level', () { |
| 128 _testVirDir('simple', (server, dir) { | 128 _testVirDir('simple', (server, dir) { |
| 129 var virDir = new VirtualDirectory(dir.path); | 129 var virDir = new VirtualDirectory(dir.path); |
| 130 virDir.allowDirectoryListing = true; | 130 virDir.allowDirectoryListing = true; |
| 131 | 131 |
| 132 virDir.serve(server); | 132 virDir.serve(server); |
| 133 | 133 |
| 134 return getAsString(server.port, '/') | 134 return getAsString(server.port, '/') |
| 135 .then((result) { | 135 .then((result) { |
| 136 expect(result, contains('Index of /')); | 136 expect(result, contains('Index of /')); |
| 137 }); | 137 }); |
| 138 }); | 138 }); |
| 139 | 139 |
| 140 _testVirDir('files', (server, dir) { | 140 _testVirDir('files', (server, dir) { |
| 141 var virDir = new VirtualDirectory(dir.path); | 141 var virDir = new VirtualDirectory(dir.path); |
| 142 for (int i = 0; i < 10; i++) { | 142 for (int i = 0; i < 10; i++) { |
| 143 new File('${dir.path}/$i').createSync(); | 143 new File('${dir.path}/$i').createSync(); |
| 144 } | 144 } |
| 145 virDir.allowDirectoryListing = true; | 145 virDir.allowDirectoryListing = true; |
| 146 | 146 |
| 147 virDir.serve(server); | 147 virDir.serve(server); |
| 148 | 148 |
| 149 return getAsString(server.port, '/') | 149 return getAsString(server.port, '/') |
| 150 .then((result) { | 150 .then((result) { |
| 151 expect(result, contains('Index of /')); | 151 expect(result, contains('Index of /')); |
| 152 }); | 152 }); |
| 153 }); | 153 }); |
| 154 | 154 |
| 155 _testVirDir('dirs', (server, dir) { | 155 _testVirDir('dirs', (server, dir) { |
| 156 var virDir = new VirtualDirectory(dir.path); | 156 var virDir = new VirtualDirectory(dir.path); |
| 157 for (int i = 0; i < 10; i++) { | 157 for (int i = 0; i < 10; i++) { |
| 158 new Directory('${dir.path}/$i').createSync(); | 158 new Directory('${dir.path}/$i').createSync(); |
| 159 } | 159 } |
| 160 virDir.allowDirectoryListing = true; | 160 virDir.allowDirectoryListing = true; |
| 161 | 161 |
| 162 virDir.serve(server); | 162 virDir.serve(server); |
| 163 | 163 |
| 164 return getAsString(server.port, '/') | 164 return getAsString(server.port, '/') |
| 165 .then((result) { | 165 .then((result) { |
| 166 expect(result, contains('Index of /')); | 166 expect(result, contains('Index of /')); |
| 167 }); | 167 }); |
| 168 }); | 168 }); |
| 169 | 169 |
| 170 if (!Platform.isWindows) { | 170 if (!Platform.isWindows) { |
| 171 _testVirDir('recursive-link', (server, dir) { | 171 _testVirDir('recursive-link', (server, dir) { |
| 172 var link = new Link('${dir.path}/recursive')..createSync('.'); | 172 var link = new Link('${dir.path}/recursive')..createSync('.'); |
| 173 var virDir = new VirtualDirectory(dir.path); | 173 var virDir = new VirtualDirectory(dir.path); |
| 174 virDir.allowDirectoryListing = true; | 174 virDir.allowDirectoryListing = true; |
| 175 | 175 |
| 176 virDir.serve(server); | 176 virDir.serve(server); |
| 177 | 177 |
| 178 return Future.wait([ | 178 return Future.wait([ |
| 179 getAsString(server.port, '/').then( | 179 getAsString(server.port, '/').then( |
| 180 (s) => s.contains('recursive/')), | 180 (s) => s.contains('recursive/')), |
| 181 getAsString(server.port, '/').then( | 181 getAsString(server.port, '/').then( |
| 182 (s) => !s.contains('../')), | 182 (s) => !s.contains('../')), |
| 183 getAsString(server.port, '/').then( | 183 getAsString(server.port, '/').then( |
| 184 (s) => s.contains('Index of /')), | 184 (s) => s.contains('Index of /')), |
| 185 getAsString(server.port, '/recursive').then( | 185 getAsString(server.port, '/recursive').then( |
| 186 (s) => s.contains('recursive/')), | 186 (s) => s.contains('recursive/')), |
| 187 getAsString(server.port, '/recursive').then( | 187 getAsString(server.port, '/recursive').then( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 198 group('custom', () { | 198 group('custom', () { |
| 199 _testVirDir('simple', (server, dir) { | 199 _testVirDir('simple', (server, dir) { |
| 200 var virDir = new VirtualDirectory(dir.path); | 200 var virDir = new VirtualDirectory(dir.path); |
| 201 virDir.allowDirectoryListing = true; | 201 virDir.allowDirectoryListing = true; |
| 202 virDir.directoryHandler = (dir2, request) { | 202 virDir.directoryHandler = (dir2, request) { |
| 203 expect(dir2, isNotNull); | 203 expect(dir2, isNotNull); |
| 204 expect(FileSystemEntity.identicalSync(dir.path, dir2.path), isTrue); | 204 expect(FileSystemEntity.identicalSync(dir.path, dir2.path), isTrue); |
| 205 request.response.write('My handler ${request.uri.path}'); | 205 request.response.write('My handler ${request.uri.path}'); |
| 206 request.response.close(); | 206 request.response.close(); |
| 207 }; | 207 }; |
| 208 | 208 |
| 209 virDir.serve(server); | 209 virDir.serve(server); |
| 210 | 210 |
| 211 return getAsString(server.port, '/') | 211 return getAsString(server.port, '/') |
| 212 .then((result) { | 212 .then((result) { |
| 213 expect(result, 'My handler /'); | 213 expect(result, 'My handler /'); |
| 214 }); | 214 }); |
| 215 }); | 215 }); |
| 216 }); | 216 }); |
| 217 }); | 217 }); |
| 218 | 218 |
| 219 group('links', () { | 219 group('links', () { |
| 220 if (!Platform.isWindows) { | 220 if (!Platform.isWindows) { |
| 221 group('follow-links', () { | 221 group('follow-links', () { |
| 222 _testVirDir('dir-link', (server, dir) { | 222 _testVirDir('dir-link', (server, dir) { |
| 223 var dir2 = new Directory('${dir.path}/dir2')..createSync(); | 223 var dir2 = new Directory('${dir.path}/dir2')..createSync(); |
| 224 var link = new Link('${dir.path}/dir3')..createSync('dir2'); | 224 var link = new Link('${dir.path}/dir3')..createSync('dir2'); |
| 225 var file = new File('${dir2.path}/file')..createSync(); | 225 var file = new File('${dir2.path}/file')..createSync(); |
| 226 var virDir = new VirtualDirectory(dir.path); | 226 var virDir = new VirtualDirectory(dir.path); |
| 227 virDir.followLinks = true; | 227 virDir.followLinks = true; |
| 228 | 228 |
| 229 virDir.serve(server); | 229 virDir.serve(server); |
| 230 | 230 |
| 231 return getStatusCode(server.port, '/dir3/file') | 231 return getStatusCode(server.port, '/dir3/file') |
| 232 .then((result) { | 232 .then((result) { |
| 233 expect(result, HttpStatus.OK); | 233 expect(result, HttpStatus.OK); |
| 234 }); | 234 }); |
| 235 }); | 235 }); |
| 236 | 236 |
| 237 _testVirDir('root-link', (server, dir) { | 237 _testVirDir('root-link', (server, dir) { |
| 238 var link = new Link('${dir.path}/dir3')..createSync('.'); | 238 var link = new Link('${dir.path}/dir3')..createSync('.'); |
| 239 var file = new File('${dir.path}/file')..createSync(); | 239 var file = new File('${dir.path}/file')..createSync(); |
| 240 var virDir = new VirtualDirectory(dir.path); | 240 var virDir = new VirtualDirectory(dir.path); |
| 241 virDir.followLinks = true; | 241 virDir.followLinks = true; |
| 242 | 242 |
| 243 virDir.serve(server); | 243 virDir.serve(server); |
| 244 | 244 |
| 245 return getStatusCode(server.port, '/dir3/file') | 245 return getStatusCode(server.port, '/dir3/file') |
| 246 .then((result) { | 246 .then((result) { |
| 247 expect(result, HttpStatus.OK); | 247 expect(result, HttpStatus.OK); |
| 248 }); | 248 }); |
| 249 }); | 249 }); |
| 250 | 250 |
| 251 group('bad-links', () { | 251 group('bad-links', () { |
| 252 _testVirDir('absolute-link', (server, dir) { | 252 _testVirDir('absolute-link', (server, dir) { |
| 253 var file = new File('${dir.path}/file')..createSync(); | 253 var file = new File('${dir.path}/file')..createSync(); |
| 254 var link = new Link('${dir.path}/file2') | 254 var link = new Link('${dir.path}/file2') |
| 255 ..createSync('${dir.path}/file'); | 255 ..createSync('${dir.path}/file'); |
| 256 var virDir = new VirtualDirectory(dir.path); | 256 var virDir = new VirtualDirectory(dir.path); |
| 257 virDir.followLinks = true; | 257 virDir.followLinks = true; |
| 258 | 258 |
| 259 virDir.serve(server); | 259 virDir.serve(server); |
| 260 | 260 |
| 261 return new HttpClient().get('localhost', | 261 return new HttpClient().get('localhost', |
| 262 server.port, | 262 server.port, |
| 263 '/file2') | 263 '/file2') |
| 264 .then((request) => request.close()) | 264 .then((request) => request.close()) |
| 265 .then((response) => response.drain().then( | 265 .then((response) => response.drain().then( |
| 266 (_) => response.statusCode)) | 266 (_) => response.statusCode)) |
| 267 .then((result) { | 267 .then((result) { |
| 268 expect(result, HttpStatus.NOT_FOUND); | 268 expect(result, HttpStatus.NOT_FOUND); |
| 269 }); | 269 }); |
| 270 }); | 270 }); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 287 (_) => response.statusCode)) | 287 (_) => response.statusCode)) |
| 288 .then((result) { | 288 .then((result) { |
| 289 expect(result, HttpStatus.NOT_FOUND); | 289 expect(result, HttpStatus.NOT_FOUND); |
| 290 }); | 290 }); |
| 291 }); | 291 }); |
| 292 }); | 292 }); |
| 293 }); | 293 }); |
| 294 | 294 |
| 295 group('not-follow-links', () { | 295 group('not-follow-links', () { |
| 296 _testVirDir('dir-link', (server, dir) { | 296 _testVirDir('dir-link', (server, dir) { |
| 297 return HttpServer.bind('localhost', 0).then((server) { | |
| 298 var dir = | |
| 299 Directory.systemTemp.createTempSync('http_server_virtual_'); | |
| 300 var dir2 = new Directory('${dir.path}/dir2')..createSync(); | 297 var dir2 = new Directory('${dir.path}/dir2')..createSync(); |
| 301 var link = new Link('${dir.path}/dir3')..createSync('dir2'); | 298 var link = new Link('${dir.path}/dir3')..createSync('dir2'); |
| 302 var file = new File('${dir2.path}/file')..createSync(); | 299 var file = new File('${dir2.path}/file')..createSync(); |
| 303 var virDir = new VirtualDirectory(dir.path); | 300 var virDir = new VirtualDirectory(dir.path); |
| 304 virDir.followLinks = false; | 301 virDir.followLinks = false; |
| 305 | 302 |
| 306 virDir.serve(server); | 303 virDir.serve(server); |
| 307 | 304 |
| 308 return getStatusCode(server.port, '/dir3/file') | 305 return getStatusCode(server.port, '/dir3/file') |
| 309 .whenComplete(() { | 306 .then((result) { |
| 310 server.close(); | 307 expect(result, HttpStatus.NOT_FOUND); |
| 311 dir.deleteSync(recursive: true); | |
| 312 }); | 308 }); |
| 313 }) | |
| 314 .then((result) { | |
| 315 expect(result, HttpStatus.NOT_FOUND); | |
| 316 }); | |
| 317 }); | 309 }); |
| 318 }); | 310 }); |
| 319 | 311 |
| 320 group('follow-links', () { | 312 group('follow-links', () { |
| 321 group('no-root-jail', () { | 313 group('no-root-jail', () { |
| 322 _testVirDir('absolute-link', (server, dir) { | 314 _testVirDir('absolute-link', (server, dir) { |
| 323 var file = new File('${dir.path}/file')..createSync(); | 315 var file = new File('${dir.path}/file')..createSync(); |
| 324 var link = new Link('${dir.path}/file2') | 316 var link = new Link('${dir.path}/file2') |
| 325 ..createSync('${dir.path}/file'); | 317 ..createSync('${dir.path}/file'); |
| 326 var virDir = new VirtualDirectory(dir.path); | 318 var virDir = new VirtualDirectory(dir.path); |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 | 567 |
| 576 virDir.serve(server); | 568 virDir.serve(server); |
| 577 | 569 |
| 578 return getAsString(server.port, '/') | 570 return getAsString(server.port, '/') |
| 579 .then((result) { | 571 .then((result) { |
| 580 expect(result, 'file contents'); | 572 expect(result, 'file contents'); |
| 581 }); | 573 }); |
| 582 }); | 574 }); |
| 583 }); | 575 }); |
| 584 } | 576 } |
| OLD | NEW |