« index

Coverage for /Users/yunong/workspace/node-restify/lib/plugins/body_parser.js : 97%

89 lines | 87 run | 2 missing | 0 partial | 16 blocks | 14 blocks run | 2 blocks missing

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

  // Copyright 2012 Mark Cavage, Inc.  All rights reserved.
  
  var assert = require('assert-plus');
  
  var errors = require('../errors');
  
  var bodyReader = require('./body_reader');
  var jsonParser = require('./json_body_parser');
  var formParser = require('./form_body_parser');
  var multipartParser = require('./multipart_parser');
  var fieldedTextParser = require('./fielded_text_body_parser.js');
  
  
  ///--- Globals
  
  var UnsupportedMediaTypeError = errors.UnsupportedMediaTypeError;
  
  
  ///--- API
  
  function bodyParser(options) {
      assert.optionalObject(options, 'options');
      options = options || {};
      options.bodyReader = true;
  
      var read = bodyReader(options);
      var parseForm = formParser(options);
      var parseJson = jsonParser(options);
      var parseMultipart = multipartParser(options);
      var parseFieldedText = fieldedTextParser(options);
  
      function parseBody(req, res, next) {
          // Allow use of 'requestBodyOnGet' flag to allow for merging of
          // the request body of a GET request into req.params
          if (req.method === 'HEAD') {
              next();
              return;
          }
          if (req.method === 'GET') {
              if (!options.requestBodyOnGet) {
                  next();
                  return;
              }
          }
  
          if (req.contentLength() === 0 && !req.isChunked()) {
              next();
              return;
          }
  
          var parser;
          var type = req.contentType();
          switch (type) {
              case 'application/json':
                  parser = parseJson[0];
                  break;
              case 'application/x-www-form-urlencoded':
                  parser = parseForm[0];
                  break;
              case 'multipart/form-data':
                  parser = parseMultipart;
                  break;
              case 'text/tsv':
                  parser = parseFieldedText;
                  break;
              case 'text/tab-separated-values':
                  parser = parseFieldedText;
                  break;
              case 'text/csv':
                  parser = parseFieldedText;
                  break;
  
              default:
                  break;
          }
  
          if (parser) {
              parser(req, res, next);
          } else if (options && options.rejectUnknown) {
              next(new UnsupportedMediaTypeError(type));
          } else {
              next();
          }
      }
  
      return ([read, parseBody]);
  }
  
  module.exports = bodyParser;
« index | cover.io