diff --git a/lib/jsgi/media.js b/lib/jsgi/media.js index 6498234..680627d 100644 --- a/lib/jsgi/media.js +++ b/lib/jsgi/media.js @@ -1,8 +1,8 @@ /** * JSGI Middleware that provides media type content negotiation. It will deserialize - * request.input data into real objects, and then serialize response objects into a raw + * request.body data into real objects, and then serialize response objects into a raw * format for the response body. This acts as "crossover" middleware, all apps below - * will see request.input and response.body in pre/deserialized form. + * will see request.body and response.body in pre/deserialized form. */ exports.MediaConverter = MediaConverter; var METHOD_HAS_BODY = require("./methods").METHOD_HAS_BODY, @@ -12,14 +12,23 @@ function MediaConverter(mediaSelector, nextApp){ return function(request){ // TODO: Do any character set conversion if(METHOD_HAS_BODY[request.method.toLowerCase()]){ - var requestMedia = mediaSelector(request.store, request.headers["content-type"]); - if(!requestMedia){ - return {status: 415, headers:{}, body: ["Unsupported Media Type"]}; - } - try{ - request.input = requestMedia.deserialize(request.input, request); - }catch(e){ - return {status: 400, headers: {}, body: [e.message]}; + var contentDisposition = request["content-disposition"]; + if(contentDisposition && contentDisposition.substring(0,10) == "attachment"){ + contentDisposition.split(";").forEach(function(dispositionParam){ + var parts = dispositionParam.split("="); + request.body[parts[0].trim()] = request.parts[1] && request.parts[1].trim().replace(/"/g,''); + }); + request.body.attachment = true; + }else{ + var requestMedia = mediaSelector(request.store, request.headers["content-type"]); + if(!requestMedia){ + return {status: 415, headers:{}, body: ["Unsupported Media Type"]}; + } + try{ + request.body = requestMedia.deserialize(request.body, request); + }catch(e){ + return {status: 400, headers: {}, body: [e.message]}; + } } }