standby: add standby mode (#1365)

* standby: add standby mode

Add standby mode for ngx_pagespeed, equivalent to "off" in mod_pagespeed.

With this change "off" is deprecated, and people should use "unplugged" instead.

* Update mps to include test file

* update mps

* update mps

* update mps
diff --git a/src/ngx_pagespeed.cc b/src/ngx_pagespeed.cc
index fcbfb68..7bef853 100644
--- a/src/ngx_pagespeed.cc
+++ b/src/ngx_pagespeed.cc
@@ -1152,13 +1152,17 @@
   delete cfg_s->options;
   cfg_s->options = NULL;
 
-  if (cfg_s->server_context->global_options()->enabled()) {
+  if (!cfg_s->server_context->global_options()->unplugged()) {
     // Validate FileCachePath
     GoogleMessageHandler handler;
     const char* file_cache_path =
         cfg_s->server_context->config()->file_cache_path().c_str();
     if (file_cache_path[0] == '\0') {
-      return const_cast<char*>("FileCachePath must be set");
+      if (!cfg_s->server_context->global_options()->standby()) {
+        return const_cast<char*>("FileCachePath must be set, even for standby");
+      } else {
+        return const_cast<char*>("FileCachePath must be set");
+      }
     } else if (!cfg_m->driver_factory->file_system()->IsDir(
         file_cache_path, &handler).is_true()) {
       return const_cast<char*>(
@@ -1844,11 +1848,6 @@
     options = cfg_s->server_context->global_options();
   }
 
-  if (!options->enabled()) {
-    // Disabled via query params or request headers.
-    return NGX_DECLINED;
-  }
-
   request_context->set_options(options->ComputeHttpOptions());
 
   // ps_determine_options modified url, removing any ModPagespeedFoo=Bar query
@@ -1875,6 +1874,14 @@
       response_category == RequestRouting::kGlobalAdmin ||
       response_category == RequestRouting::kCachePurge;
 
+  // Normally if we're disabled we won't handle any requests, but if we're in
+  // standby mode we do want to handle requests for .pagespeed. resources.
+  if (options->unplugged() ||
+      (!options->enabled() && !pagespeed_resource)) {
+    // Disabled via query params or request headers.
+    return NGX_DECLINED;
+  }
+
   if (!html_rewrite) {
     // create request ctx
     CHECK(ctx == NULL);
diff --git a/src/ngx_rewrite_options.cc b/src/ngx_rewrite_options.cc
index 772b8ea..290872e 100644
--- a/src/ngx_rewrite_options.cc
+++ b/src/ngx_rewrite_options.cc
@@ -192,15 +192,18 @@
 
 RewriteOptions::OptionSettingResult NgxRewriteOptions::ParseAndSetOptions0(
     StringPiece directive, GoogleString* msg, MessageHandler* handler) {
-  if (IsDirective(directive, "on")) {
-    set_enabled(RewriteOptions::kEnabledOn);
-  } else if (IsDirective(directive, "off")) {
-    set_enabled(RewriteOptions::kEnabledOff);
-  } else if (IsDirective(directive, "unplugged")) {
-    set_enabled(RewriteOptions::kEnabledUnplugged);
-  } else {
+  EnabledEnum enabled;
+  if (!ParseFromString(directive, &enabled)) {
     return RewriteOptions::kOptionNameUnknown;
   }
+  if (enabled == RewriteOptions::kEnabledOff) {
+    // In ngx_pagespeed, for historical reasons, we treat "off" as "unplugged".
+    // Also, "off" is deprecated and people should be using "standby" or
+    // "unplugged" now depending on which sense they want.  See comment on
+    // RewriteOptions::EnabledEnum.
+    enabled = RewriteOptions::kEnabledUnplugged;
+  }
+  set_enabled(enabled);
   return RewriteOptions::kOptionOk;
 }
 
diff --git a/test/pagespeed_test.conf.template b/test/pagespeed_test.conf.template
index aa22358..e579589 100644
--- a/test/pagespeed_test.conf.template
+++ b/test/pagespeed_test.conf.template
@@ -132,6 +132,42 @@
       "@@SERVER_ROOT@@/mod_pagespeed_example/styles/";
   }
 
+  server {
+    listen @@SECONDARY_PORT@@;
+    listen [::]:@@SECONDARY_PORT@@;
+    server_name pagespeed-off.example.com;
+    pagespeed FileCachePath "@@FILE_CACHE@@";
+    pagespeed off;
+    pagespeed EnableFilters collapse_whitespace;
+  }
+
+  server {
+    listen @@SECONDARY_PORT@@;
+    listen [::]:@@SECONDARY_PORT@@;
+    server_name pagespeed-on.example.com;
+    pagespeed FileCachePath "@@FILE_CACHE@@";
+    pagespeed on;
+    pagespeed EnableFilters collapse_whitespace;
+  }
+
+  server {
+    listen @@SECONDARY_PORT@@;
+    listen [::]:@@SECONDARY_PORT@@;
+    server_name pagespeed-standby.example.com;
+    pagespeed FileCachePath "@@FILE_CACHE@@";
+    pagespeed standby;
+    pagespeed EnableFilters collapse_whitespace;
+  }
+
+  server {
+    listen @@SECONDARY_PORT@@;
+    listen [::]:@@SECONDARY_PORT@@;
+    server_name pagespeed-unplugged.example.com;
+    pagespeed FileCachePath "@@FILE_CACHE@@";
+    pagespeed unplugged;
+    pagespeed EnableFilters collapse_whitespace;
+  }
+
   pagespeed UseNativeFetcher "@@NATIVE_FETCHER@@";
   @@RESOLVER@@
 
diff --git a/testing-dependencies/mod_pagespeed b/testing-dependencies/mod_pagespeed
index c50a93f..a41cdab 160000
--- a/testing-dependencies/mod_pagespeed
+++ b/testing-dependencies/mod_pagespeed
@@ -1 +1 @@
-Subproject commit c50a93f2e846dc7b4de8833ae6a19491bc14ed04
+Subproject commit a41cdab05eea514ac9f405fb32bd8e24ff9f0614