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

Side by Side Diff: pkg/scheduled_test/lib/scheduled_server.dart

Issue 311253005: Bind to all available loopback addresses in pub. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « pkg/scheduled_test/CHANGELOG.md ('k') | pkg/scheduled_test/pubspec.yaml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 scheduled_test.scheduled_server; 5 library scheduled_test.scheduled_server;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 import 'dart:io'; 9 import 'dart:io';
10 10
11 import 'package:http_multi_server/http_multi_server.dart';
11 import 'package:shelf/shelf.dart' as shelf; 12 import 'package:shelf/shelf.dart' as shelf;
12 import 'package:shelf/shelf_io.dart' as shelf_io; 13 import 'package:shelf/shelf_io.dart' as shelf_io;
13 14
14 import 'scheduled_test.dart'; 15 import 'scheduled_test.dart';
15 import 'src/scheduled_server/handler.dart'; 16 import 'src/scheduled_server/handler.dart';
16 import 'src/utils.dart'; 17 import 'src/utils.dart';
17 18
18 /// A class representing an HTTP server that's scheduled to run in the course of 19 /// A class representing an HTTP server that's scheduled to run in the course of
19 /// the test. This class allows the server's request handling to be scheduled 20 /// the test. This class allows the server's request handling to be scheduled
20 /// synchronously. 21 /// synchronously.
(...skipping 11 matching lines...) Expand all
32 /// complete once the schedule reaches the point where that handler was 33 /// complete once the schedule reaches the point where that handler was
33 /// scheduled. 34 /// scheduled.
34 final _handlers = new Queue<Handler>(); 35 final _handlers = new Queue<Handler>();
35 36
36 /// The number of servers created. Used for auto-generating descriptions; 37 /// The number of servers created. Used for auto-generating descriptions;
37 static var _count = 0; 38 static var _count = 0;
38 39
39 ScheduledServer._(this._server, this.description); 40 ScheduledServer._(this._server, this.description);
40 41
41 /// Creates a new server listening on an automatically-allocated port on 42 /// Creates a new server listening on an automatically-allocated port on
42 /// 127.0.0.1. [description] is used to refer to the server in debugging 43 /// localhost (both IPv4 and IPv6, if available).
43 /// messages. 44 ///
45 /// [description] is used to refer to the server in debugging messages.
44 factory ScheduledServer([String description]) { 46 factory ScheduledServer([String description]) {
45 var id = _count++; 47 var id = _count++;
46 if (description == null) description = 'scheduled server $id'; 48 if (description == null) description = 'scheduled server $id';
47 49
48 var scheduledServer; 50 var scheduledServer;
49 scheduledServer = new ScheduledServer._(schedule(() { 51 scheduledServer = new ScheduledServer._(schedule(() {
50 return shelf_io.serve(scheduledServer._handleRequest, "127.0.0.1", 0) 52 return HttpMultiServer.loopback(0).then((server) {
51 .then((server) { 53 shelf_io.serveRequests(server, scheduledServer._handleRequest);
52 currentSchedule.onComplete.schedule(() => server.close(force: true)); 54 currentSchedule.onComplete.schedule(() => server.close(force: true));
53 return server; 55 return server;
54 }); 56 });
55 }, "starting '$description'"), description); 57 }, "starting '$description'"), description);
56 return scheduledServer; 58 return scheduledServer;
57 } 59 }
58 60
59 /// The port on which the server is listening. 61 /// The port on which the server is listening.
60 Future<int> get port => _server.then((s) => s.port); 62 Future<int> get port => _server.then((s) => s.port);
61 63
62 /// The base URL of the server, including its port. 64 /// The base URL of the server, including its port.
63 Future<Uri> get url => port.then((p) => Uri.parse("http://127.0.0.1:$p")); 65 Future<Uri> get url => port.then((p) => Uri.parse("http://localhost:$p"));
64 66
65 /// Schedules [handler] to handle a request to the server with [method] and 67 /// Schedules [handler] to handle a request to the server with [method] and
66 /// [path]. The schedule will wait until an HTTP request is received. If that 68 /// [path]. The schedule will wait until an HTTP request is received. If that
67 /// request doesn't have the expected [method] and [path], it will fail. 69 /// request doesn't have the expected [method] and [path], it will fail.
68 /// Otherwise, it will run [fn]. If [fn] returns a [Future], the schedule will 70 /// Otherwise, it will run [fn]. If [fn] returns a [Future], the schedule will
69 /// wait until that [Future] completes. 71 /// wait until that [Future] completes.
70 /// 72 ///
71 /// The request must be received at the point in the schedule at which 73 /// The request must be received at the point in the schedule at which
72 /// [handle] was called, or in the task immediately prior (to allow for 74 /// [handle] was called, or in the task immediately prior (to allow for
73 /// non-deterministic asynchronicity). Otherwise, an error will be thrown. 75 /// non-deterministic asynchronicity). Otherwise, an error will be thrown.
(...skipping 21 matching lines...) Expand all
95 }), 'receiving ${request.method} ${request.url.path}').catchError((error) { 97 }), 'receiving ${request.method} ${request.url.path}').catchError((error) {
96 // Don't let errors bubble up to the shelf handler. It will print them to 98 // Don't let errors bubble up to the shelf handler. It will print them to
97 // stderr, but the user will already be notified via the scheduled_test 99 // stderr, but the user will already be notified via the scheduled_test
98 // infrastructure. 100 // infrastructure.
99 return new shelf.Response.internalServerError( 101 return new shelf.Response.internalServerError(
100 body: error.toString(), 102 body: error.toString(),
101 headers: {'content-type': 'text/plain'}); 103 headers: {'content-type': 'text/plain'});
102 }); 104 });
103 } 105 }
104 } 106 }
OLDNEW
« no previous file with comments | « pkg/scheduled_test/CHANGELOG.md ('k') | pkg/scheduled_test/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698