diff --git a/bin/configure-fastly.js b/bin/configure-fastly.js index 1065ba8e1..4f698fedf 100644 --- a/bin/configure-fastly.js +++ b/bin/configure-fastly.js @@ -1,6 +1,7 @@ var async = require('async'); var defaults = require('lodash.defaults'); var fastlyConfig = require('./lib/fastly-config-methods'); +const languages = require('./languages.json'); var route_json = require('../src/routes.json'); @@ -41,23 +42,43 @@ async.auto({ // on any of those route conditions. var notPassStatement = fastlyConfig.getAppRouteCondition('../build/*', routes, extraAppRoutes, __dirname); - // For all the routes in routes.json, construct a varnish-style regex that matches - // only if NONE of those routes are matched. - var passStatement = fastlyConfig.negateConditionStatement(notPassStatement); - // For a non-pass condition, point backend at s3 - var backendCondition = fastlyConfig.setBackend( - 'F_s3', - S3_BUCKET_NAME, - notPassStatement - ); - // For a pass condition, set forwarding headers - var forwardCondition = fastlyConfig.setForwardHeaders(passStatement); + var recvCondition = '' + + 'if (' + notPassStatement + ') {\n' + + ' set req.backend = F_s3;\n' + + ' set req.http.host = \"' + S3_BUCKET_NAME + '\";\n' + + '} else {\n' + + ' if (!req.http.Fastly-FF) {\n' + + ' if (req.http.X-Forwarded-For) {\n' + + ' set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For \", \" client.ip;\n' + + ' } else {\n' + + ' set req.http.Fastly-Temp-XFF = client.ip;\n' + + ' }\n' + + ' } else {\n' + + ' set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For;\n' + + ' }\n' + + ' set req.grace = 60s;\n' + + ' if (req.http.Cookie:scratchlanguage) {\n' + + ' set req.http.Accept-Language = req.http.Cookie:scratchlanguage;\n' + + ' } else {\n' + + ' set req.http.Accept-Language = accept.language_lookup("' + + Object.keys(languages).join(':') + '", ' + + '"en", ' + + 'std.tolower(req.http.Accept-Language)' + + ');\n' + + ' }\n' + + ' if (req.url ~ "^/projects/" && !req.http.Cookie:scratchsessionid) {\n' + + ' set req.http.Cookie = req.http.Cookie:scratchlanguage;\n' + + ' } else {\n' + + ' return(pass);\n' + + ' }\n' + + '}\n'; + fastly.setCustomVCL( results.version, 'recv-condition', - backendCondition + forwardCondition, + recvCondition, cb ); }], diff --git a/bin/lib/fastly-config-methods.js b/bin/lib/fastly-config-methods.js index d84756262..8ef064715 100644 --- a/bin/lib/fastly-config-methods.js +++ b/bin/lib/fastly-config-methods.js @@ -84,45 +84,6 @@ var FastlyConfigMethods = { return 'redirects/' + route.pattern; }, - /** - * Returns custom vcl configuration as a string for setting the backend - * of a request to the given backend/host. - * - * @param {string} backend name of the backend declared in fastly - * @param {string} host name of the s3 bucket to be set as the host - * @param {string} condition condition under which backend should be set - */ - setBackend: function (backend, host, condition) { - return '' + - 'if (' + condition + ') {\n' + - ' set req.backend = ' + backend + ';\n' + - ' set req.http.host = \"' + host + '\";\n' + - '}\n'; - }, - - /** - * Returns custom vcl configuration as a string for headers that - * should be added for the condition in which a request is forwarded. - * - * @param {string} condition condition under which to set pass headers - */ - setForwardHeaders: function (condition) { - return '' + - 'if (' + condition + ') {\n' + - ' if (!req.http.Fastly-FF) {\n' + - ' if (req.http.X-Forwarded-For) {\n' + - ' set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For \", \" client.ip;\n' + - ' } else {\n' + - ' set req.http.Fastly-Temp-XFF = client.ip;\n' + - ' }\n' + - ' } else {\n' + - ' set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For;\n' + - ' }\n' + - ' set req.grace = 60s;\n' + - ' return(pass);\n' + - '}\n'; - }, - /** * Returns custom vcl configuration as a string that sets the varnish * Time to Live (TTL) for responses that come from s3. @@ -132,9 +93,13 @@ var FastlyConfigMethods = { setResponseTTL: function (condition) { return '' + 'if (' + condition + ') {\n' + - ' set beresp.ttl = 0s;\n' + - ' set beresp.grace = 0s;\n' + - ' return(pass);\n' + + ' if (req.url ~ "^/projects/" && !req.http.Cookie:scratchsessionid) {\n' + + ' set beresp.http.Vary = "Accept-Encoding, Accept-Language";\n' + + ' } else {\n' + + ' set beresp.ttl = 0s;\n' + + ' set beresp.grace = 0s;\n' + + ' return(pass);\n' + + ' }\n' + '}\n'; } }; diff --git a/test/unit/test_fastly_config_methods.js b/test/unit/test_fastly_config_methods.js index 229d07043..a2880006f 100644 --- a/test/unit/test_fastly_config_methods.js +++ b/test/unit/test_fastly_config_methods.js @@ -59,44 +59,17 @@ tap.test('getAppRouteCondition', function (t) { t.end(); }); -tap.test('testSetBackend', function (t) { - var backend = fastlyConfig.setBackend('wemust', 'goback', 'marty'); - t.equal(backend, '' + - 'if (marty) {\n' + - ' set req.backend = wemust;\n' + - ' set req.http.host = \"goback\";\n' + - '}\n' - ); - t.end(); -}); - -tap.test('testSetForward', function (t) { - var forward = fastlyConfig.setForwardHeaders('alwaysforward'); - t.equal(forward, '' + - 'if (alwaysforward) {\n' + - ' if (!req.http.Fastly-FF) {\n' + - ' if (req.http.X-Forwarded-For) {\n' + - ' set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For ", " client.ip;\n' + - ' } else {\n' + - ' set req.http.Fastly-Temp-XFF = client.ip;\n' + - ' }\n' + - ' } else {\n' + - ' set req.http.Fastly-Temp-XFF = req.http.X-Forwarded-For;\n' + - ' }\n' + - ' set req.grace = 60s;\n' + - ' return(pass);\n' + - '}\n' - ); - t.end(); -}); - tap.test('testSetTTL', function (t) { var ttl = fastlyConfig.setResponseTTL('itsactuallyttyl'); t.equal(ttl, '' + 'if (itsactuallyttyl) {\n' + - ' set beresp.ttl = 0s;\n' + - ' set beresp.grace = 0s;\n' + - ' return(pass);\n' + + ' if (req.url ~ "^/projects/" && !req.http.Cookie:scratchsessionid) {\n' + + ' set beresp.http.Vary = "Accept-Encoding, Accept-Language";\n' + + ' } else {\n' + + ' set beresp.ttl = 0s;\n' + + ' set beresp.grace = 0s;\n' + + ' return(pass);\n' + + ' }\n' + '}\n' ); t.end();