From d71b459d5873bd46553e882023f1f0c20cb72ac1 Mon Sep 17 00:00:00 2001 From: Lucas Dohmen Date: Wed, 20 Mar 2013 14:29:21 +0100 Subject: [PATCH] Fuxx: Added support for default in FormatMiddleware --- js/common/modules/org/arangodb/frank.js | 23 ++++++++++++++--------- js/common/tests/shell-frank.js | 8 ++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/js/common/modules/org/arangodb/frank.js b/js/common/modules/org/arangodb/frank.js index d67cef5dbb..e6962aecba 100644 --- a/js/common/modules/org/arangodb/frank.js +++ b/js/common/modules/org/arangodb/frank.js @@ -449,12 +449,16 @@ BaseMiddleware = function (templateCollection, helperCollection) { // Use it by calling: // // FormatMiddleware = require('frank').FormatMiddleware; -// app.use(FormatMiddleware.new(['json'])); +// app.before("/*", FormatMiddleware.new(['json'])); // // or the shortcut: // // app.accepts(['json']); -FormatMiddleware = function (allowedFormats) { +// +// In both forms you can give a default format as a second parameter, +// if no format could be determined. If you give no defaultFormat this +// case will be handled as an error. +FormatMiddleware = function (allowedFormats, defaultFormat) { 'use strict'; var middleware, urlFormatToMime, mimeToUrlFormat, determinePathAndFormat; @@ -470,9 +474,9 @@ FormatMiddleware = function (allowedFormats) { "text/plain": "txt" }; - determinePathAndFormat = function(path, headers) { + determinePathAndFormat = function (path, headers) { var parsed = { - contentType: headers.accept, + contentType: headers.accept }; path = path.split('.'); @@ -483,16 +487,17 @@ FormatMiddleware = function (allowedFormats) { parsed.path = path.join('.'); } - if (parsed.contentType === undefined) { + if (parsed.contentType === undefined && parsed.format === undefined) { + parsed.format = defaultFormat; + parsed.contentType = urlFormatToMime[defaultFormat]; + } else if (parsed.contentType === undefined) { parsed.contentType = urlFormatToMime[parsed.format]; - } - - if (parsed.format === undefined) { + } else if (parsed.format === undefined) { parsed.format = mimeToUrlFormat[parsed.contentType]; } if (parsed.format !== mimeToUrlFormat[parsed.contentType]) { - parsed.error = "Contradiction between Accept Header and URL." + parsed.error = "Contradiction between Accept Header and URL."; } if (allowedFormats.indexOf(parsed.format) < 0) { diff --git a/js/common/tests/shell-frank.js b/js/common/tests/shell-frank.js index d3791d95bf..12fcbc0c66 100644 --- a/js/common/tests/shell-frank.js +++ b/js/common/tests/shell-frank.js @@ -533,6 +533,14 @@ function FormatMiddlewareSpec () { assertFalse(nextCalled); }, + testFallBackToDefaultWhenMissingBothURLAndResponseType: function () { + request = { path: "test/1", headers: {} }; + middleware = new Middleware(["json"], "json"); + middleware(request, response, options, next); + assertEqual(request.format, "json"); + assertEqual(response.contentType, "application/json"); + }, + // JSON testSettingTheFormatAttributeAndResponseTypeForJsonViaURL: function () { request = { path: "test/1.json", headers: {} };