request/lib/multipart.js

Maintainability

67.40

Lines of code

109

Created with Raphaël 2.1.002550751002015-5-18

2015-5-18
Maintainability: 67.4

Created with Raphaël 2.1.00501001502002015-5-18

2015-5-18
Lines of Code: 109

Difficulty

34.33

Estimated Errors

0.91

Function weight

By Complexity

Created with Raphaël 2.1.0<anonymous>.isChunked6

By SLOC

Created with Raphaël 2.1.0<anonymous>.build31
1
'use strict'
Column: 0 "Use the function form of "use strict"."
Column: 1 "Missing semicolon."
2
 
3
var uuid = require('node-uuid')
Column: 31 "Bad line breaking before ','."
4
  , CombinedStream = require('combined-stream')
Column: 3 "Comma warnings can be turned off with 'laxcomma'."
Column: 47 "Bad line breaking before ','."
5
  , isstream = require('isstream')
Column: 35 "Missing semicolon."
6
 
7
 
8
function Multipart (request) {
9
  this.request = request
Column: 25 "Missing semicolon."
10
  this.boundary = uuid()
Column: 25 "Missing semicolon."
11
  this.chunked = false
Column: 23 "Missing semicolon."
12
  this.body = null
Column: 19 "Missing semicolon."
13
}
14
 
15
Multipart.prototype.isChunked = function (options) {
16
  var self = this
Column: 14 "Bad line breaking before ','."
17
    , chunked = false
Column: 17 "Bad line breaking before ','."
18
    , parts = options.data || options
Column: 38 "Missing semicolon."
19
 
20
  if (!parts.forEach) {
21
    self.request.emit('error', new Error('Argument error, options.multipart.'))
Column: 80 "Missing semicolon."
22
  }
23
 
24
  if (options.chunked !== undefined) {
25
    chunked = options.chunked
Column: 30 "Missing semicolon."
26
  }
27
 
28
  if (self.request.getHeader('transfer-encoding') === 'chunked') {
29
    chunked = true
Column: 19 "Missing semicolon."
30
  }
31
 
32
  if (!chunked) {
33
    parts.forEach(function (part) {
34
      if (typeof part.body === 'undefined') {
35
        self.request.emit('error', new Error('Body attribute missing in multipart.'))
Column: 86 "Missing semicolon."
36
      }
37
      if (isstream(part.body)) {
38
        chunked = true
Column: 23 "Missing semicolon."
39
      }
40
    })
Column: 7 "Missing semicolon."
41
  }
42
 
43
  return chunked
Column: 17 "Missing semicolon."
44
}
Column: 2 "Missing semicolon."
45
 
46
Multipart.prototype.setHeaders = function (chunked) {
47
  var self = this
Column: 18 "Missing semicolon."
48
 
49
  if (chunked && !self.request.hasHeader('transfer-encoding')) {
50
    self.request.setHeader('transfer-encoding', 'chunked')
Column: 59 "Missing semicolon."
51
  }
52
 
53
  var header = self.request.getHeader('content-type')
Column: 54 "Missing semicolon."
54
 
55
  if (!header || header.indexOf('multipart') === -1) {
56
    self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary)
Column: 91 "Missing semicolon."
57
  } else {
58
    if (header.indexOf('boundary') !== -1) {
59
      self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1')
Column: 69 "Missing semicolon."
60
    } else {
61
      self.request.setHeader('content-type', header + '; boundary=' + self.boundary)
Column: 85 "Missing semicolon."
62
    }
63
  }
64
}
Column: 2 "Missing semicolon."
65
 
66
Multipart.prototype.build = function (parts, chunked) {
67
  var self = this
Column: 18 "Missing semicolon."
68
  var body = chunked ? new CombinedStream() : []
Column: 49 "Missing semicolon."
69
 
70
  function add (part) {
71
    return chunked ? body.append(part) : body.push(new Buffer(part))
Column: 69 "Missing semicolon."
72
  }
73
 
74
  if (self.request.preambleCRLF) {
75
    add('\r\n')
Column: 16 "Missing semicolon."
76
  }
77
 
78
  parts.forEach(function (part) {
79
    var preamble = '--' + self.boundary + '\r\n'
Column: 49 "Missing semicolon."
80
    Object.keys(part).forEach(function (key) {
81
      if (key === 'body') { return }
Column: 35 "Missing semicolon."
82
      preamble += key + ': ' + part[key] + '\r\n'
Column: 50 "Missing semicolon."
83
    })
Column: 7 "Missing semicolon."
84
    preamble += '\r\n'
Column: 23 "Missing semicolon."
85
    add(preamble)
Column: 18 "Missing semicolon."
86
    add(part.body)
Column: 19 "Missing semicolon."
87
    add('\r\n')
Column: 16 "Missing semicolon."
88
  })
Column: 5 "Missing semicolon."
89
  add('--' + self.boundary + '--')
Column: 35 "Missing semicolon."
90
 
91
  if (self.request.postambleCRLF) {
92
    add('\r\n')
Column: 16 "Missing semicolon."
93
  }
94
 
95
  return body
Column: 14 "Missing semicolon."
96
}
Column: 2 "Missing semicolon."
97
 
98
Multipart.prototype.onRequest = function (options) {
99
  var self = this
Column: 18 "Missing semicolon."
100
 
101
  var chunked = self.isChunked(options)
Column: 39 "Bad line breaking before ','."
102
    , parts = options.data || options
Column: 38 "Missing semicolon."
103
 
104
  self.setHeaders(chunked)
Column: 27 "Missing semicolon."
105
  self.chunked = chunked
Column: 25 "Missing semicolon."
Column: 25 "Too many errors. (96% scanned)."
106
  self.body = self.build(parts, chunked)
107
}
108
 
109
exports.Multipart = Multipart