Support Firefox (#13)

* Support firefox
diff --git a/.travis.yml b/.travis.yml
index 3756641..e0371f6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,7 @@
 language: dart
-# This is necessary to use proper Chrome. Travis's version of chromium is from
-# 2014.
 sudo: required
-dist: trusty
 addons:
   chrome: stable
-  apt:
-    sources:
-      - google-chrome
-    packages:
-      - google-chrome-stable
-  firefox: latest
 
 dart:
   - dev
@@ -19,18 +10,14 @@
 with_content_shell: false
 
 before_install:
-  - export CHROMEDRIVER_BINARY=/usr/bin/google-chrome
-  - export CHROMEDRIVER_ARGS=--no-sandbox
-  - /usr/bin/google-chrome --version
-  - export DISPLAY=:99.0
-  - sh -e /etc/init.d/xvfb start
-
-before_script:
+  - "export CHROMEDRIVER_BINARY=/usr/bin/google-chrome"
+  - "export CHROMEDRIVER_ARGS=--no-sandbox"
+  - "/usr/bin/google-chrome --version"
   - "export CHROME_LATEST_VERSION=$(/usr/bin/google-chrome --version | cut -d' ' -f3 | cut -d'.' -f1)"
   - "export CHROME_DRIVER_VERSION=$(wget -qO- https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$CHROME_LATEST_VERSION)"
   - "wget https://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip"
   - unzip chromedriver_linux64.zip
-  - export PATH=$PATH:$PWD
+  - "export PATH=$PATH:$PWD"
   - ./tool/travis-setup.sh
 
 script:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8246f13..a1921db 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.1.0
+
+- Support Firefox.
+
 ## 2.0.3
 
 - Fix an issue where messages could come out of order.
diff --git a/lib/server/sse_handler.dart b/lib/server/sse_handler.dart
index a3067f6..83017ff 100644
--- a/lib/server/sse_handler.dart
+++ b/lib/server/sse_handler.dart
@@ -12,12 +12,12 @@
 import 'package:stream_channel/stream_channel.dart';
 
 String _sseHeaders(String origin) => 'HTTP/1.1 200 OK\r\n'
-    'Content-Type: text/event-stream\r\n'
-    'Cache-Control: no-cache\r\n'
-    'Connection: keep-alive\r\n'
-    'Access-Control-Allow-Credentials: true\r\n'
-    'Access-Control-Allow-Origin: $origin\r\n'
-    '\r\n';
+    'Content-Type: text/event-stream\n\n'
+    'Cache-Control: no-cache\n\n'
+    'Connection: keep-alive\n\n'
+    'Access-Control-Allow-Credentials: true\n\n'
+    'Access-Control-Allow-Origin: $origin\n\n'
+    '\n\n';
 
 /// A bi-directional SSE connection between server and browser.
 class SseConnection extends StreamChannelMixin<String> {
@@ -140,7 +140,12 @@
     }
     return shelf.Response.ok('', headers: {
       'access-control-allow-credentials': 'true',
-      'access-control-allow-origin': req.headers['origin']
+      'access-control-allow-origin': _originFor(req),
     });
   }
+
+  String _originFor(shelf.Request req) =>
+      // Firefox does not set header "origin".
+      // https://bugzilla.mozilla.org/show_bug.cgi?id=1508661
+      req.headers['origin'] ?? req.headers['host'];
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 649ffc2..e2631cc 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: sse
-version: 2.0.3
+version: 2.1.0
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/sse
 description: >-