[appengine] Redirect all http traffic to https

Fixes: https://github.com/dart-lang/dart_ci/issues/18
Change-Id: I37245e3bec3262f512e68a1863172467bf6e617a
Reviewed-on: https://dart-review.googlesource.com/c/dart_ci/+/235800
Reviewed-by: Jonas Termansen <sortie@google.com>
Commit-Queue: William Hesse <whesse@google.com>
diff --git a/appengine/bin/server.dart b/appengine/bin/server.dart
index efe8e7e..3e82ff7 100644
--- a/appengine/bin/server.dart
+++ b/appengine/bin/server.dart
@@ -20,6 +20,12 @@
 
 Future<void> dispatchingServer(HttpRequest request) async {
   try {
+    if (request.headers['X-Forwarded-Proto']?.first == 'http') {
+      return redirectPermanent(
+          request, request.requestedUri.replace(scheme: 'https').toString());
+    }
+    request.response.headers
+        .add('Strict-Transport-Security', 'max-age=31536000; preload');
     final path = request.uri.path;
     if (path.startsWith('/log/')) {
       await serveLog(request);
@@ -141,6 +147,12 @@
   return request.response.close();
 }
 
+Future<void> redirectPermanent(HttpRequest request, String newPath) {
+  request.response.headers.add(HttpHeaders.locationHeader, newPath);
+  request.response.statusCode = HttpStatus.movedPermanently;
+  return request.response.close();
+}
+
 Future<void> notFound(HttpRequest request, {String message}) {
   request.response.statusCode = HttpStatus.notFound;
   if (message != null) {