Skip to content
This repository has been archived by the owner on Jan 17, 2023. It is now read-only.

Commit

Permalink
Fix #3231, Use English as default if Accept-Language header is missin…
Browse files Browse the repository at this point in the history
…g or '*' (#3367)
  • Loading branch information
jaredhirsch authored Aug 17, 2017
1 parent d8f22cd commit d8425c6
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 14 deletions.
28 changes: 28 additions & 0 deletions server/src/middleware/l10n.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require("../logging").installConsoleHandler();
const mozlog = require("../logging").mozlog("l10n-middleware");
const accepts = require("accepts");
const l10n = require("../l10n");

// Get an ordered list of user-preferred locales from the Accept-Language header
exports.getLanguages = function(req) {
let languages = accepts(req).languages();
// 'accepts' returns '*' if no Accept-Language header was passed. Use English
// as a default instead. #3231
if (languages[0] === '*') {
languages = ['en-US'];
}
return languages;
};

exports.l10n = function(req, res, next) {
l10n.init().then(() => {
let languages = exports.getLanguages(req);
req.getText = l10n.getText(languages);
req.userLocales = l10n.getUserLocales(languages);
req.messages = l10n.getStrings(languages);
next();
}).catch(err => {
mozlog.error("l10n-middleware-error", {msg: "Error initializing l10n", description: err});
process.exit(2);
});
};
16 changes: 2 additions & 14 deletions server/src/server.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const config = require("./config").getProperties();
require("./logging").installConsoleHandler();
const mozlog = require("./logging").mozlog("server");
const accepts = require("accepts");
const path = require('path');
const { readFileSync, existsSync } = require('fs');
const Cookies = require("cookies");
Expand Down Expand Up @@ -45,7 +44,7 @@ const { captureRavenException, sendRavenMessage,
const { errorResponse, simpleResponse, jsResponse } = require("./responses");
const selfPackage = require("./package.json");
const { b64EncodeJson, b64DecodeJson } = require("./b64");
const l10n = require("./l10n");
const { l10n } = require("./middleware/l10n");

const PROXY_HEADER_WHITELIST = {
"content-type": true,
Expand Down Expand Up @@ -269,18 +268,7 @@ app.use(function(req, res, next) {
next();
});

app.use(function(req, res, next) {
l10n.init().then(() => {
const languages = accepts(req).languages();
req.getText = l10n.getText(languages);
req.userLocales = l10n.getUserLocales(languages);
req.messages = l10n.getStrings(languages);
next();
}).catch(err => {
mozlog.error("l10n-error", {msg: "Error initializing l10n", description: err});
process.exit(2);
});
});
app.use(l10n);

app.param("id", function(req, res, next, id) {
if (/^[a-zA-Z0-9]{16}$/.test(id)) {
Expand Down
33 changes: 33 additions & 0 deletions test/server/unit/middleware/l10n-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const assert = require('assert');
const l10n = require('../../../../server/src/middleware/l10n.js');

/* globals describe, it */

describe('l10n middleware', () => {
describe('getLanguage function (Accept-Language header parsing)', () => {
it('should return ["en-US"] if Accept-Language header is missing', () => {
let mockRequest = { headers: {} };
let results = l10n.getLanguages(mockRequest);
assert(results.length === 1);
assert.equal('en-US', results[0]);
});
it('should return ["en-US"] if Accept-Language header value is "*"', () => {
let mockRequest = { headers: { 'accept-language': '*' }};
let results = l10n.getLanguages(mockRequest);
assert(results.length === 1);
assert.equal('en-US', results[0]);
});
it('should return ["en-US"] if Accept-Language header value is "en-CA"', () => {
let mockRequest = { headers: { 'accept-language': 'en-CA' }};
let results = l10n.getLanguages(mockRequest);
assert(results.length === 1);
assert.equal('en-US', results[0]);
});
it('should return ["en-US"] if Accept-Language header value is "en"', () => {
let mockRequest = { headers: { 'accept-language': 'en' }};
let results = l10n.getLanguages(mockRequest);
assert(results.length === 1);
assert.equal('en-US', results[0]);
});
});
});

0 comments on commit d8425c6

Please # to comment.