react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / lib / multipart.js
81141 views'use strict'12var uuid = require('node-uuid')3, CombinedStream = require('combined-stream')4, isstream = require('isstream')567function Multipart (request) {8this.request = request9this.boundary = uuid()10this.chunked = false11this.body = null12}1314Multipart.prototype.isChunked = function (options) {15var self = this16, chunked = false17, parts = options.data || options1819if (!parts.forEach) {20self.request.emit('error', new Error('Argument error, options.multipart.'))21}2223if (options.chunked !== undefined) {24chunked = options.chunked25}2627if (self.request.getHeader('transfer-encoding') === 'chunked') {28chunked = true29}3031if (!chunked) {32parts.forEach(function (part) {33if (typeof part.body === 'undefined') {34self.request.emit('error', new Error('Body attribute missing in multipart.'))35}36if (isstream(part.body)) {37chunked = true38}39})40}4142return chunked43}4445Multipart.prototype.setHeaders = function (chunked) {46var self = this4748if (chunked && !self.request.hasHeader('transfer-encoding')) {49self.request.setHeader('transfer-encoding', 'chunked')50}5152var header = self.request.getHeader('content-type')5354if (!header || header.indexOf('multipart') === -1) {55self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary)56} else {57if (header.indexOf('boundary') !== -1) {58self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1')59} else {60self.request.setHeader('content-type', header + '; boundary=' + self.boundary)61}62}63}6465Multipart.prototype.build = function (parts, chunked) {66var self = this67var body = chunked ? new CombinedStream() : []6869function add (part) {70return chunked ? body.append(part) : body.push(new Buffer(part))71}7273if (self.request.preambleCRLF) {74add('\r\n')75}7677parts.forEach(function (part) {78var preamble = '--' + self.boundary + '\r\n'79Object.keys(part).forEach(function (key) {80if (key === 'body') { return }81preamble += key + ': ' + part[key] + '\r\n'82})83preamble += '\r\n'84add(preamble)85add(part.body)86add('\r\n')87})88add('--' + self.boundary + '--')8990if (self.request.postambleCRLF) {91add('\r\n')92}9394return body95}9697Multipart.prototype.onRequest = function (options) {98var self = this99100var chunked = self.isChunked(options)101, parts = options.data || options102103self.setHeaders(chunked)104self.chunked = chunked105self.body = self.build(parts, chunked)106}107108exports.Multipart = Multipart109110111