Add Travis-CI support (#5)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..73833e5
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,24 @@
+language: dart
+
+dart:
+  - dev
+  - stable
+
+dart_task:
+  - test
+
+matrix:
+  include:
+    # Only validate formatting using the dev release
+    - dart: dev
+      dart_task: dartfmt
+    - dart: dev
+      dart_task: analyzer
+
+# Only building master means that we don't run two builds for each pull request.
+branches:
+  only: [master]
+
+cache:
+ directories:
+   - $HOME/.pub-cache
diff --git a/lib/shelf_web_socket.dart b/lib/shelf_web_socket.dart
index 3d376aa..9c9239d 100644
--- a/lib/shelf_web_socket.dart
+++ b/lib/shelf_web_socket.dart
@@ -38,12 +38,12 @@
 /// See also the WebSocket spec's discussion of [origin considerations][].
 ///
 /// [origin considerations]: https://tools.ietf.org/html/rfc6455#section-10.2
-Handler webSocketHandler(Function onConnection, {Iterable<String> protocols,
-      Iterable<String> allowedOrigins}) {
+Handler webSocketHandler(Function onConnection,
+    {Iterable<String> protocols, Iterable<String> allowedOrigins}) {
   if (protocols != null) protocols = protocols.toSet();
   if (allowedOrigins != null) {
-    allowedOrigins = allowedOrigins
-        .map((origin) => origin.toLowerCase()).toSet();
+    allowedOrigins =
+        allowedOrigins.map((origin) => origin.toLowerCase()).toSet();
   }
 
   if (onConnection is! _BinaryFunction) {
diff --git a/lib/src/web_socket_handler.dart b/lib/src/web_socket_handler.dart
index b8f94a2..05b7bb4 100644
--- a/lib/src/web_socket_handler.dart
+++ b/lib/src/web_socket_handler.dart
@@ -26,8 +26,8 @@
 
     var connection = request.headers['Connection'];
     if (connection == null) return _notFound();
-    var tokens = connection.toLowerCase().split(',')
-        .map((token) => token.trim());
+    var tokens =
+        connection.toLowerCase().split(',').map((token) => token.trim());
     if (!tokens.contains('upgrade')) return _notFound();
 
     var upgrade = request.headers['Upgrade'];
@@ -58,7 +58,8 @@
     // unexpected origins, we ensure that malicious JavaScript is unable to fake
     // a WebSocket handshake.
     var origin = request.headers['Origin'];
-    if (origin != null && _allowedOrigins != null &&
+    if (origin != null &&
+        _allowedOrigins != null &&
         !_allowedOrigins.contains(origin.toLowerCase())) {
       return _forbidden('invalid origin "$origin".');
     }
@@ -66,8 +67,7 @@
     var protocol = _chooseProtocol(request);
     request.hijack((channel) {
       var sink = UTF8.encoder.startChunkedConversion(channel.sink);
-      sink.add(
-          "HTTP/1.1 101 Switching Protocols\r\n"
+      sink.add("HTTP/1.1 101 Switching Protocols\r\n"
           "Upgrade: websocket\r\n"
           "Connection: Upgrade\r\n"
           "Sec-WebSocket-Accept: ${WebSocketChannel.signKey(key)}\r\n");
@@ -97,20 +97,20 @@
   }
 
   /// Returns a 404 Not Found response.
-  Response _notFound() => _htmlResponse(404, "404 Not Found",
-      "Only WebSocket connections are supported.");
+  Response _notFound() => _htmlResponse(
+      404, "404 Not Found", "Only WebSocket connections are supported.");
 
   /// Returns a 400 Bad Request response.
   ///
   /// [message] will be HTML-escaped before being included in the response body.
-  Response _badRequest(String message) => _htmlResponse(400, "400 Bad Request",
-      "Invalid WebSocket upgrade request: $message");
+  Response _badRequest(String message) => _htmlResponse(
+      400, "400 Bad Request", "Invalid WebSocket upgrade request: $message");
 
   /// Returns a 403 Forbidden response.
   ///
   /// [message] will be HTML-escaped before being included in the response body.
-  Response _forbidden(String message) => _htmlResponse(403, "403 Forbidden",
-      "WebSocket upgrade refused: $message");
+  Response _forbidden(String message) => _htmlResponse(
+      403, "403 Forbidden", "WebSocket upgrade refused: $message");
 
   /// Creates an HTTP response with the given [statusCode] and an HTML body with
   /// [title] and [message].
diff --git a/test/web_socket_test.dart b/test/web_socket_test.dart
index b061c04..6b83d94 100644
--- a/test/web_socket_test.dart
+++ b/test/web_socket_test.dart
@@ -10,11 +10,11 @@
 import 'package:test/test.dart';
 
 Map<String, String> get _handshakeHeaders => {
-  "Upgrade": "websocket",
-  "Connection": "Upgrade",
-  "Sec-WebSocket-Key": "x3JJHMbDL1EzLkh9GBhXDw==",
-  "Sec-WebSocket-Version": "13"
-};
+      "Upgrade": "websocket",
+      "Connection": "Upgrade",
+      "Sec-WebSocket-Key": "x3JJHMbDL1EzLkh9GBhXDw==",
+      "Sec-WebSocket-Version": "13"
+    };
 
 void main() {
   test("can communicate with a dart:io WebSocket client", () async {
@@ -49,14 +49,16 @@
   });
 
   test("negotiates the sub-protocol", () async {
-    var server = await shelf_io.serve(webSocketHandler((webSocket, protocol) {
-      expect(protocol, equals("two"));
-      webSocket.sink.close();
-    }, protocols: ["three", "two", "x"]), "localhost", 0);
+    var server = await shelf_io.serve(
+        webSocketHandler((webSocket, protocol) {
+          expect(protocol, equals("two"));
+          webSocket.sink.close();
+        }, protocols: ["three", "two", "x"]),
+        "localhost",
+        0);
 
     try {
-      var webSocket = await WebSocket.connect(
-          'ws://localhost:${server.port}',
+      var webSocket = await WebSocket.connect('ws://localhost:${server.port}',
           protocols: ["one", "two", "three"]);
       expect(webSocket.protocol, equals("two"));
       return webSocket.close();
@@ -69,9 +71,12 @@
     var server;
     var url;
     setUp(() async {
-      server = await shelf_io.serve(webSocketHandler((webSocket) {
-        webSocket.sink.close();
-      }, allowedOrigins: ["pub.dartlang.org", "GoOgLe.CoM"]), "localhost", 0);
+      server = await shelf_io.serve(
+          webSocketHandler((webSocket) {
+            webSocket.sink.close();
+          }, allowedOrigins: ["pub.dartlang.org", "GoOgLe.CoM"]),
+          "localhost",
+          0);
       url = 'http://localhost:${server.port}/';
     });
 
@@ -173,7 +178,7 @@
 }
 
 Matcher hasStatus(int status) => completion(predicate((response) {
-  expect(response, new isInstanceOf<http.Response>());
-  expect(response.statusCode, equals(status));
-  return true;
-}));
+      expect(response, new isInstanceOf<http.Response>());
+      expect(response.statusCode, equals(status));
+      return true;
+    }));