From 80bef5ea9bed63eb0a677057f35ed351920cca7f Mon Sep 17 00:00:00 2001 From: David Greenspan Date: Tue, 5 Jun 2012 16:46:50 -0700 Subject: [PATCH] allow semicolon in JSON Content-Type --- packages/http/httpcall_client.js | 10 +--------- packages/http/httpcall_common.js | 17 +++++++++++++++++ packages/http/httpcall_server.js | 10 +--------- packages/http/test_responder.js | 2 +- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/packages/http/httpcall_client.js b/packages/http/httpcall_client.js index cd124c7e95..f8b3421868 100644 --- a/packages/http/httpcall_client.js +++ b/packages/http/httpcall_client.js @@ -125,15 +125,7 @@ Meteor.http = Meteor.http || {}; response.headers[m[1].toLowerCase()] = m[2]; }); - // only parse data if correct content type. - if (_.include(['application/json', 'text/javascript'], - response.headers['content-type'])) { - try { - response.data = JSON.parse(response.content); - } catch (err) { - response.data = null; - } - }; + Meteor.http._populateData(response); var error = null; if (xhr.status >= 400) diff --git a/packages/http/httpcall_common.js b/packages/http/httpcall_common.js index 61ee09239a..39c5cf81b0 100644 --- a/packages/http/httpcall_common.js +++ b/packages/http/httpcall_common.js @@ -35,6 +35,23 @@ Meteor.http = Meteor.http || {}; return url; }; + Meteor.http._populateData = function(response) { + // Read Content-Type header, up to a ';' if there is one. + // A typical header might be "application/json; charset=utf-8" + // or just "application/json". + var contentType = (response.headers['content-type'] || ';').split(';')[0]; + + // Only try to parse data as JSON if server sets correct content type. + if (_.include(['application/json', 'text/javascript'], contentType)) { + try { + response.data = JSON.parse(response.content); + } catch (err) { + response.data = null; + } + } else { + response.data = null; + } + }; Meteor.http.get = function (/* varargs */) { return Meteor.http.call.apply(this, ["GET"].concat(_.toArray(arguments))); diff --git a/packages/http/httpcall_server.js b/packages/http/httpcall_server.js index 95c6dfe297..980dacf661 100644 --- a/packages/http/httpcall_server.js +++ b/packages/http/httpcall_server.js @@ -111,15 +111,7 @@ Meteor.http = Meteor.http || {}; response.content = body; response.headers = res.headers; - // only parse data if correct content type. - if (_.include(['application/json', 'text/javascript'], - response.headers['content-type'])) { - try { - response.data = JSON.parse(response.content); - } catch (err) { - response.data = null; - } - }; + Meteor.http._populateData(response); if (res.statusCode >= 400) error = new Error("failed"); diff --git a/packages/http/test_responder.js b/packages/http/test_responder.js index f0903dd327..e17c8934c6 100644 --- a/packages/http/test_responder.js +++ b/packages/http/test_responder.js @@ -68,7 +68,7 @@ var respond = function(req, res) { response_string = JSON.stringify(response_data); res.statusCode = 200; - res.setHeader("Content-Type", "application/json"); + res.setHeader("Content-Type", "application/json; charset=utf-8"); res.end(response_string); });