UNPKG

3.05 kBJavaScriptView Raw
1/**
2 * @license
3 * MOST Web Framework 2.0 Codename Blueshift
4 * Copyright (c) 2017, THEMOST LP All rights reserved
5 *
6 * Use of this source code is governed by an BSD-3-Clause license that can be
7 * found in the LICENSE file at https://themost.io/license
8 */
9var HttpBadRequestError = require("@themost/common/errors").HttpBadRequestError;
10var raw = require('raw-body');
11var DOMParser = require('xmldom').DOMParser;
12var contentTypeParser = require('content-type');
13var _ = require('lodash');
14
15function hasXmlContent(request) {
16 if (typeof request.headers['content-type'] !== 'string') {
17 return false;
18 }
19 var contentType = contentTypeParser.parse(request.headers['content-type']);
20 if (typeof contentType === 'undefined' || contentType === null) {
21 return false;
22 }
23 return /(\+xml)|(\/xml)$/i.test(contentType.type) && (request.method !== 'GET');
24}
25
26/**
27 * @class
28 * @constructor
29 * @implements BeginRequestHandler
30 * @implements ValidateRequestHandler
31 */
32function XmlHandler() {
33
34}
35
36/**
37 * @param {HttpContext} context
38 * @param {Function} callback
39 */
40XmlHandler.prototype.beginRequest = function(context, callback) {
41 var request = context.request;
42 if (hasXmlContent(request)) {
43 var configurationOptions = context.getApplication().getConfiguration().getSourceAt('settings/xml');
44 var options = _.assign({
45 limit: '1mb',
46 encoding: 'utf8'
47 }, configurationOptions);
48 var len = request.headers['content-length'];
49 if (len) {
50 options.length = len;
51 }
52 return raw(request, options).then(function (str) {
53 request.body = str;
54 return callback();
55 }).catch(function (err) {
56 return callback(err);
57 });
58 }
59 return callback();
60};
61/**
62 * @param {HttpContext} context
63 * @param {Function} callback
64 */
65XmlHandler.prototype.validateRequest = function(context, callback) {
66 var request = context.request;
67 if (hasXmlContent(request)) {
68 //validate xml
69 if (typeof request.body === 'string') {
70// eslint-disable-next-line no-unused-vars
71 var doc;
72 var parser;
73 var errors = [];
74 try {
75 parser = new DOMParser({
76 locator:{
77
78 },
79 errorHandler:{
80 error:function(msg){
81 errors.push(msg);
82 }
83 }
84 });
85 doc = parser.parseFromString(request.body,'application/xml');
86 if (errors.length>0) {
87 return callback(new HttpBadRequestError(errors[0]));
88 }
89 }
90 catch (err) {
91 return callback(err);
92 }
93 return callback();
94 }
95 }
96 return callback();
97};
98if (typeof exports !== 'undefined') {
99 module.exports.XmlHandler = XmlHandler;
100 module.exports.createInstance = function() {
101 return new XmlHandler();
102 };
103}