@sap/async-xsjs 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +37 -0
  3. package/README.md +445 -0
  4. package/differences.md +162 -0
  5. package/docs/$.Application.html +262 -0
  6. package/docs/$.Session.html +674 -0
  7. package/docs/$.db.CallableStatement.html +2524 -0
  8. package/docs/$.db.Connection.html +511 -0
  9. package/docs/$.db.ParameterMetaData.html +805 -0
  10. package/docs/$.db.PreparedStatement.html +1796 -0
  11. package/docs/$.db.ResultSet.html +1308 -0
  12. package/docs/$.db.ResultSetMetaData.html +800 -0
  13. package/docs/$.db.SQLException.html +259 -0
  14. package/docs/$.db.html +773 -0
  15. package/docs/$.hdb.ColumnMetadata.html +438 -0
  16. package/docs/$.hdb.Connection.html +663 -0
  17. package/docs/$.hdb.ProcedureResult.html +280 -0
  18. package/docs/$.hdb.ResultSet.html +324 -0
  19. package/docs/$.hdb.ResultSetIterator.html +315 -0
  20. package/docs/$.hdb.ResultSetMetaData.html +259 -0
  21. package/docs/$.hdb.SQLException.html +259 -0
  22. package/docs/$.hdb.html +557 -0
  23. package/docs/$.html +471 -0
  24. package/docs/$.jobs.Job.html +783 -0
  25. package/docs/$.jobs.JobLog.html +380 -0
  26. package/docs/$.jobs.JobSchedules.html +852 -0
  27. package/docs/$.jobs.html +238 -0
  28. package/docs/$.net.Destination.html +304 -0
  29. package/docs/$.net.Mail.Part.html +510 -0
  30. package/docs/$.net.Mail.html +504 -0
  31. package/docs/$.net.SMTPConnection.html +347 -0
  32. package/docs/$.net.html +749 -0
  33. package/docs/$.net.http.Client.html +562 -0
  34. package/docs/$.net.http.Destination.html +237 -0
  35. package/docs/$.net.http.Request.html +567 -0
  36. package/docs/$.net.http.html +292 -0
  37. package/docs/$.security.AntiVirus.html +361 -0
  38. package/docs/$.security.Store.html +636 -0
  39. package/docs/$.security.crypto.html +414 -0
  40. package/docs/$.security.html +247 -0
  41. package/docs/$.security.x509.html +373 -0
  42. package/docs/$.text.analysis.Session.html +983 -0
  43. package/docs/$.text.analysis.html +242 -0
  44. package/docs/$.text.html +246 -0
  45. package/docs/$.text.mining.Session.html +2018 -0
  46. package/docs/$.text.mining.html +242 -0
  47. package/docs/$.trace.html +525 -0
  48. package/docs/$.util.SAXParser.html +955 -0
  49. package/docs/$.util.Zip.html +474 -0
  50. package/docs/$.util.codec.html +414 -0
  51. package/docs/$.util.compression.html +357 -0
  52. package/docs/$.util.html +325 -0
  53. package/docs/$.util.sql.html +290 -0
  54. package/docs/$.web.Body.html +333 -0
  55. package/docs/$.web.EntityList.html +296 -0
  56. package/docs/$.web.TupelList.html +496 -0
  57. package/docs/$.web.WebEntityRequest.html +393 -0
  58. package/docs/$.web.WebEntityResponse.html +392 -0
  59. package/docs/$.web.WebRequest.html +560 -0
  60. package/docs/$.web.WebResponse.html +609 -0
  61. package/docs/$.web.html +246 -0
  62. package/docs/Copyright-SAP.html +39 -0
  63. package/docs/Disclaimer-SAP.html +55 -0
  64. package/docs/index.html +232 -0
  65. package/docs/styles/jsdoc-default.css +382 -0
  66. package/lib/AppConfig.js +36 -0
  67. package/lib/AuditLogger.js +41 -0
  68. package/lib/cacert.js +26 -0
  69. package/lib/ctypes.js +153 -0
  70. package/lib/destinations/dest-provider.js +57 -0
  71. package/lib/index.js +235 -0
  72. package/lib/jobs/Action.js +40 -0
  73. package/lib/jobs/Job.js +100 -0
  74. package/lib/jobs/JobManager.js +150 -0
  75. package/lib/jobs/JobsRuntime.js +133 -0
  76. package/lib/jobs/SqlScriptJobRunner.js +36 -0
  77. package/lib/jobs/XsjsJobRunner.js +78 -0
  78. package/lib/jobs/index.js +11 -0
  79. package/lib/logging.js +16 -0
  80. package/lib/middleware.js +125 -0
  81. package/lib/odata/ODataService.js +125 -0
  82. package/lib/odata/index.js +7 -0
  83. package/lib/odata/service-factory.js +26 -0
  84. package/lib/passport-noauth.js +17 -0
  85. package/lib/routes.js +115 -0
  86. package/lib/runtime.js +740 -0
  87. package/lib/sandbox.js +40 -0
  88. package/lib/utils/XsJsFunctionRunner.js +57 -0
  89. package/lib/utils/XsJsLibFunctionRunner.js +57 -0
  90. package/lib/utils/buffer-utils.js +77 -0
  91. package/lib/utils/compression-utils.js +14 -0
  92. package/lib/utils/date-utils.js +104 -0
  93. package/lib/utils/errors/HttpError.js +20 -0
  94. package/lib/utils/errors/wrap-app-error.js +18 -0
  95. package/lib/utils/index.js +17 -0
  96. package/lib/utils/xs-function-runner.js +51 -0
  97. package/lib/utils/xs-types.js +21 -0
  98. package/lib/utils/xspath.js +36 -0
  99. package/lib/utils/xsstack.js +28 -0
  100. package/lib/views/error.html +28 -0
  101. package/lib/xsjs/Application.js +28 -0
  102. package/lib/xsjs/Locale.js +53 -0
  103. package/lib/xsjs/Session.js +31 -0
  104. package/lib/xsjs/constants.js +71 -0
  105. package/lib/xsjs/db/common/DbBase.js +85 -0
  106. package/lib/xsjs/db/common/DbOptions.js +163 -0
  107. package/lib/xsjs/db/common/arguments-validation.js +102 -0
  108. package/lib/xsjs/db/common/connection.js +12 -0
  109. package/lib/xsjs/db/common/enums.js +93 -0
  110. package/lib/xsjs/db/common/execute-batch.js +38 -0
  111. package/lib/xsjs/db/common/parse-time.js +139 -0
  112. package/lib/xsjs/db/dbapi/CallableStatement.js +192 -0
  113. package/lib/xsjs/db/dbapi/Connection.js +78 -0
  114. package/lib/xsjs/db/dbapi/DB.js +39 -0
  115. package/lib/xsjs/db/dbapi/ParameterMetaData.js +118 -0
  116. package/lib/xsjs/db/dbapi/PreparedStatement.js +78 -0
  117. package/lib/xsjs/db/dbapi/ResultSet.js +220 -0
  118. package/lib/xsjs/db/dbapi/ResultSetMetaData.js +116 -0
  119. package/lib/xsjs/db/dbapi/Statement.js +514 -0
  120. package/lib/xsjs/db/dbapi/conversions.js +113 -0
  121. package/lib/xsjs/db/dbapi/fetch-rows.js +32 -0
  122. package/lib/xsjs/db/hdbapi/Connection.js +525 -0
  123. package/lib/xsjs/db/hdbapi/HDB.js +32 -0
  124. package/lib/xsjs/db/hdbapi/ResultSetIterator.js +40 -0
  125. package/lib/xsjs/db/hdbapi/convert.js +77 -0
  126. package/lib/xsjs/db/hdbapi/table-string-parser.js +52 -0
  127. package/lib/xsjs/db/index.js +4 -0
  128. package/lib/xsjs/index.js +13 -0
  129. package/lib/xsjs/jobs/Job.js +228 -0
  130. package/lib/xsjs/jobs/Jobs.js +11 -0
  131. package/lib/xsjs/jobs/Logs.js +127 -0
  132. package/lib/xsjs/jobs/Schedule.js +110 -0
  133. package/lib/xsjs/jobs/Schedules.js +108 -0
  134. package/lib/xsjs/net/Destination.js +43 -0
  135. package/lib/xsjs/net/http/Client.js +220 -0
  136. package/lib/xsjs/net/http/HTTP.js +72 -0
  137. package/lib/xsjs/net/index.js +5 -0
  138. package/lib/xsjs/net/smtp/Mail.js +38 -0
  139. package/lib/xsjs/net/smtp/Part.js +30 -0
  140. package/lib/xsjs/net/smtp/SMTPConnection.js +39 -0
  141. package/lib/xsjs/net/smtp/index.js +18 -0
  142. package/lib/xsjs/net/smtp/nodemailer-util.js +77 -0
  143. package/lib/xsjs/require.js +39 -0
  144. package/lib/xsjs/security/AntiVirus.js +31 -0
  145. package/lib/xsjs/security/Store.js +119 -0
  146. package/lib/xsjs/security/crypto.js +23 -0
  147. package/lib/xsjs/security/index.js +5 -0
  148. package/lib/xsjs/security/x509.js +12 -0
  149. package/lib/xsjs/text/analysis/Session.js +128 -0
  150. package/lib/xsjs/text/index.js +30 -0
  151. package/lib/xsjs/text/mining/Session.js +82 -0
  152. package/lib/xsjs/trace/trace.js +41 -0
  153. package/lib/xsjs/util/SAXParser.js +174 -0
  154. package/lib/xsjs/util/Zip.js +220 -0
  155. package/lib/xsjs/util/codec.js +33 -0
  156. package/lib/xsjs/util/compression.js +24 -0
  157. package/lib/xsjs/util/index.js +22 -0
  158. package/lib/xsjs/web/BasicWebEntity.js +41 -0
  159. package/lib/xsjs/web/EntityList.js +11 -0
  160. package/lib/xsjs/web/TupelLists/CookiesTupelList.js +47 -0
  161. package/lib/xsjs/web/TupelLists/HeadersTupelList.js +55 -0
  162. package/lib/xsjs/web/TupelLists/ParametersTupelList.js +83 -0
  163. package/lib/xsjs/web/TupelLists/TupelListBase.js +45 -0
  164. package/lib/xsjs/web/WebBody.js +135 -0
  165. package/lib/xsjs/web/WebEntityRequest.js +40 -0
  166. package/lib/xsjs/web/WebEntityResponse.js +26 -0
  167. package/lib/xsjs/web/WebRequest.js +209 -0
  168. package/lib/xsjs/web/WebResponse.js +183 -0
  169. package/lib/xsjs/web/index.js +4 -0
  170. package/lib/xsjs/web/utils/HeadersParser.js +53 -0
  171. package/lib/xsjs/web/utils/HttpRequestParser.js +93 -0
  172. package/lib/xsjs/web/utils/MultipartParser.js +163 -0
  173. package/lib/xsjs/web/utils/MultipartResponseBuilder.js +73 -0
  174. package/lib/xsjs/web/utils/SetCookieParser.js +32 -0
  175. package/lib/xsjslib/TextBundleWrapper.js +46 -0
  176. package/lib/xsjslib/index.js +11 -0
  177. package/npm-shrinkwrap.json +11540 -0
  178. package/package.json +84 -0
@@ -0,0 +1,93 @@
1
+ 'use strict';
2
+
3
+ var util = require('util');
4
+ var qs = require('querystring');
5
+ var cookieParser = require('cookie');
6
+ var CRLF = require('../../constants').WEB.MESSAGES.LINE_BREAK;
7
+ var HeadersParser = require('./HeadersParser');
8
+
9
+ exports.parse = function(requestString) {
10
+ var parsedRequest = {};
11
+
12
+ parseRequestLine(requestString, parsedRequest);
13
+ parseHeaders(requestString, parsedRequest);
14
+ parseCookie(parsedRequest);
15
+ parseBody(requestString, parsedRequest);
16
+ parseParamsFromBody(parsedRequest);
17
+
18
+ return parsedRequest;
19
+ };
20
+
21
+ function parseRequestLine(requestString, parsedRequest) {
22
+ var endOfRequestLine = requestString.indexOf(CRLF);
23
+ var requestLine = requestString.substring(0, endOfRequestLine);
24
+ var components = requestLine.split(' ');
25
+ if (components.length !== 3) {
26
+ throw new Error(util.format('HTTP request parser: request line should contain 3 components: Method, URI and protocol version. Actual: "%s"', requestLine));
27
+ }
28
+ parsedRequest.method = components[0];
29
+ parsedRequest.originalUrl = components[1];
30
+ parsedRequest.url = parsedRequest.originalUrl;
31
+ parsedRequest.path = parsePathFromRequestLine(components[1]);
32
+ parsedRequest.query = parseQueryParametersFromRequestLine(components[1]);
33
+ var found = components[2].match(/\d.*/);
34
+ if (!found) {
35
+ throw new Error(util.format('HTTP request parser: HTTP version could not be parsed: "%s"', components[2]));
36
+ }
37
+ parsedRequest.httpVersion = found[0];
38
+ }
39
+
40
+ function parsePathFromRequestLine(uri) {
41
+ var beginOfQueryParameters = uri.indexOf('?');
42
+ if (beginOfQueryParameters > -1) {
43
+ return uri.substring(0, beginOfQueryParameters);
44
+ } else {
45
+ return uri;
46
+ }
47
+ }
48
+
49
+ function parseQueryParametersFromRequestLine(uri) {
50
+ var beginOfQueryParameters = uri.indexOf('?');
51
+ if (beginOfQueryParameters < 0) {
52
+ return {};
53
+ }
54
+
55
+ var queryParamsString = uri.substring(beginOfQueryParameters + 1);
56
+ return qs.parse(queryParamsString);
57
+ }
58
+
59
+ function parseHeaders(requestString, parsedRequest) {
60
+ var headersSection = extractHeadersSection(requestString);
61
+ parsedRequest.headers = HeadersParser.parse(headersSection);
62
+ }
63
+
64
+ function extractHeadersSection(requestString) {
65
+ var endOfRequestLine = requestString.indexOf(CRLF);
66
+ var startOfHeadersSection = endOfRequestLine + CRLF.length;
67
+ var endOfHeadersSection = requestString.indexOf(CRLF + CRLF);
68
+ if (endOfHeadersSection < 0) {
69
+ throw new Error('HTTP request parser: message is not valid - there should be a blank line after the headers');
70
+ }
71
+ return requestString.substring(startOfHeadersSection, endOfHeadersSection);
72
+ }
73
+
74
+ function parseCookie(parsedRequest) {
75
+ var requestCookies = parsedRequest.headers.cookie;
76
+ if (!requestCookies) {
77
+ parsedRequest.cookies = {};
78
+ return;
79
+ }
80
+ parsedRequest.cookies = cookieParser.parse(requestCookies);
81
+ }
82
+
83
+ function parseBody(requestString, parsedRequest) {
84
+ // a check for the mandatory blank line has already taken place
85
+ var startOfBody = requestString.indexOf(CRLF + CRLF) + CRLF.length + CRLF.length;
86
+ parsedRequest.body = requestString.substring(startOfBody);
87
+ }
88
+
89
+ function parseParamsFromBody(parsedRequest) {
90
+ if (parsedRequest.headers['content-type'] === 'application/x-www-form-urlencoded') {
91
+ parsedRequest['form-urlencoded'] = qs.parse(parsedRequest.body);
92
+ }
93
+ }
@@ -0,0 +1,163 @@
1
+ 'use strict';
2
+
3
+ var qs = require('querystring');
4
+ var contentTypeParser = require('content-type');
5
+ var HeadersParser = require('./HeadersParser');
6
+ var WebEntityRequest = require('../WebEntityRequest');
7
+ var WebEntityResponse = require('../WebEntityResponse');
8
+ var CRLF = require('../../constants').WEB.MESSAGES.LINE_BREAK;
9
+ var MESSAGE_TYPE = require('../../constants').WEB.MESSAGE_TYPE;
10
+
11
+
12
+ exports.parseFromBuffer = function(inputBuffer, boundary, targetBasicWebEntity, messageType) {
13
+ var inputString = inputBuffer ? inputBuffer.toString('utf8') : '';
14
+ exports.parse(inputString, boundary, targetBasicWebEntity, messageType);
15
+ };
16
+
17
+ exports.parse = function(inputString, boundary, targetBasicWebEntity, messageType, coordinates) {
18
+ if (!coordinates) {
19
+ coordinates = [{level: 1}];
20
+ }
21
+
22
+ var state = {
23
+ currentState : inputString,
24
+ boundary : '--' + boundary,
25
+ closingBoundary : '--' + boundary + '--',
26
+ targetBasicWebEntity : targetBasicWebEntity,
27
+ messageType : messageType,
28
+ coordinates : coordinates
29
+ };
30
+
31
+ separateParts(state);
32
+ handleParts(state);
33
+ };
34
+
35
+ function separateParts(state) {
36
+ removeFirstBoundaryAndBefore(state);
37
+ removeLastBoundaryAndAfter(state);
38
+ state.currentState = state.currentState.split(CRLF + state.boundary + CRLF);
39
+ }
40
+
41
+ function removeFirstBoundaryAndBefore(state) {
42
+ var searchFor = state.boundary + CRLF;
43
+ var foundAt = state.currentState.indexOf(searchFor);
44
+ if (foundAt < 0) {
45
+ throw new Error(buildErrorMessage(state) + ' Could not find encapsulation boundary (' + state.boundary + ') followed by a CRLF in the multipart body');
46
+ }
47
+ state.currentState = state.currentState.substring(foundAt + searchFor.length);
48
+ }
49
+
50
+ function removeLastBoundaryAndAfter(state) {
51
+ var searchFor = CRLF + state.closingBoundary;
52
+ var foundAt = state.currentState.indexOf(searchFor);
53
+ if (foundAt < 0) {
54
+ throw new Error(buildErrorMessage(state) + ' Could not find closing boundary (' + state.closingBoundary + ') preceded by a CRLF');
55
+ }
56
+ state.currentState = state.currentState.substring(0, foundAt);
57
+ }
58
+
59
+ function handleParts(state) {
60
+ for (var i = 0; i < state.currentState.length; i++) {
61
+ handleSinglePart(state, state.currentState[i], i + 1);
62
+ }
63
+ }
64
+
65
+ function handleSinglePart(state, strSinglePart, partNumber) {
66
+ var coordinatesLastElement = state.coordinates[state.coordinates.length - 1];
67
+ coordinatesLastElement.part = partNumber;
68
+
69
+ var parsedHeaders = parseHeaders(state, strSinglePart);
70
+ var parsedBody = parseBody(strSinglePart);
71
+ var parsedParameters = parseParameters(state, parsedHeaders, parsedBody);
72
+
73
+ if (thereAreNestedEntities(parsedHeaders)) {
74
+ var containerEntity;
75
+
76
+ if (state.messageType === MESSAGE_TYPE.REQUEST) {
77
+ containerEntity = new WebEntityRequest();
78
+ containerEntity.parameters._addData(parsedParameters);
79
+ } else {
80
+ containerEntity = new WebEntityResponse();
81
+ }
82
+
83
+ containerEntity.headers._addData(parsedHeaders);
84
+ containerEntity.body = undefined;
85
+ state.targetBasicWebEntity.entities.push(containerEntity);
86
+
87
+ var boundary = extractBoundaryFromString(state, parsedHeaders);
88
+ var newCoordinates = state.coordinates.slice();
89
+ newCoordinates.push({ level: coordinatesLastElement.level + 1 });
90
+ exports.parse(parsedBody, boundary, containerEntity, state.messageType, newCoordinates);
91
+ } else {
92
+ if (state.messageType === MESSAGE_TYPE.REQUEST) {
93
+ state.targetBasicWebEntity.entities.push(WebEntityRequest.create(parsedHeaders, parsedParameters, parsedBody));
94
+ } else {
95
+ state.targetBasicWebEntity.entities.push(WebEntityResponse.create(parsedHeaders, parsedBody));
96
+ }
97
+ }
98
+ }
99
+
100
+ function parseHeaders(state, strSinglePart) {
101
+ var areThereHeaders = strSinglePart.indexOf(CRLF) !== 0;
102
+ if (areThereHeaders) {
103
+ var endOfHeadersSection = strSinglePart.indexOf(CRLF + CRLF);
104
+ if (endOfHeadersSection < 0) {
105
+ throw new Error(buildErrorMessage(state) + ' There should be a blank line between the headers and the body. Providing a body (empty one is also acceptable) is mandatory');
106
+ }
107
+ var headersSection = strSinglePart.substring(0, endOfHeadersSection);
108
+ return HeadersParser.parse(headersSection);
109
+ } else {
110
+ return {};
111
+ }
112
+ }
113
+
114
+ function parseBody(strSinglePart) {
115
+ var areThereHeaders = strSinglePart.indexOf(CRLF) !== 0;
116
+ if (areThereHeaders) {
117
+ // here we rely that 'parseHeaders' has checked that there is a blank line between headers and body
118
+ var startOfBody = strSinglePart.indexOf(CRLF + CRLF) + CRLF.length + CRLF.length;
119
+ return strSinglePart.substring(startOfBody);
120
+ } else {
121
+ return strSinglePart.substring(CRLF.length);
122
+ }
123
+ }
124
+
125
+ function parseParameters(state, parsedHeaders, parsedBody) {
126
+ if (state.messageType === MESSAGE_TYPE.RESPONSE) {
127
+ return {};
128
+ }
129
+ if (parsedHeaders['content-type'] === 'application/x-www-form-urlencoded') {
130
+ return qs.parse(parsedBody);
131
+ } else {
132
+ return {};
133
+ }
134
+ }
135
+
136
+ function thereAreNestedEntities(parsedHeaders) {
137
+ var contentType = parsedHeaders['content-type'];
138
+ if (!contentType) {
139
+ return false;
140
+ }
141
+ return (contentType.indexOf('multipart') > -1);
142
+ }
143
+
144
+ function extractBoundaryFromString(state, parsedHeaders) {
145
+ var contentType = parsedHeaders['content-type'];
146
+ var boundary = contentTypeParser.parse(contentType).parameters.boundary;
147
+ if (!boundary) {
148
+ throw new Error(buildErrorMessage(state) + ' No boundary parameter found on header Content-Type (' + contentType + ')');
149
+ }
150
+ return boundary;
151
+ }
152
+
153
+ function buildErrorMessage(state) {
154
+ var str = 'Error in multipart message: ';
155
+ state.coordinates.forEach(function(coordinate) {
156
+ str += 'level ' + coordinate.level;
157
+ if (coordinate.part) {
158
+ str += ', part ' + coordinate.part;
159
+ }
160
+ str += '; ';
161
+ });
162
+ return str;
163
+ }
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ var CRLF = require('../../constants').WEB.MESSAGES.LINE_BREAK;
4
+
5
+ var ALLOWED_CHARS_FOR_MULTIPART_BOUNDARY = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
6
+ var MULTIPART_BOUNDARY_LENGTH = 38;
7
+
8
+ exports.build = function(webEntityResponse, boundary) {
9
+ var state = {
10
+ builtString: '',
11
+ usedBoundaries: [boundary]
12
+ };
13
+
14
+ handleEntities(webEntityResponse.entities, boundary, state);
15
+
16
+ return state.builtString;
17
+ };
18
+
19
+ function handleEntities(entities, boundary, state) {
20
+ entities.forEach(function(singleEntity) {
21
+ handleEntity(singleEntity, boundary, state);
22
+ });
23
+ state.builtString += '--' + boundary + '--' + CRLF;
24
+ }
25
+
26
+ function handleEntity(entity, boundary, state) {
27
+ state.builtString += '--' + boundary + CRLF;
28
+ handleHeaders(entity.headers, state);
29
+
30
+ if (entity.entities.length === 0) {
31
+ state.builtString += CRLF;
32
+ var body = (entity.body ? entity.body.asString() : '');
33
+ state.builtString += body + CRLF;
34
+ } else {
35
+ var newBoundary = generateNewBoundary(state);
36
+ state.builtString += 'content-type: multipart/mixed; boundary=' + newBoundary + CRLF;
37
+ state.builtString += CRLF;
38
+ handleEntities(entity.entities, newBoundary, state);
39
+ }
40
+ }
41
+
42
+ function handleHeaders(headers, state) {
43
+ headers.forEach(function (singleTupelPair) {
44
+ if (!isMultipart(singleTupelPair.name, singleTupelPair.value)) {
45
+ state.builtString += singleTupelPair.name + ': ' + singleTupelPair.value + CRLF;
46
+ }
47
+ });
48
+ }
49
+
50
+ function isMultipart(name, value) {
51
+ return (name === 'content-type' && value.indexOf('multipart') > -1);
52
+ }
53
+
54
+ exports.generateBoundary = function() {
55
+ var generatedBoundary = '';
56
+ var random;
57
+ for (var i = 0; i < MULTIPART_BOUNDARY_LENGTH; i++) {
58
+ random = Math.floor(Math.random() * ALLOWED_CHARS_FOR_MULTIPART_BOUNDARY.length);
59
+ generatedBoundary += ALLOWED_CHARS_FOR_MULTIPART_BOUNDARY.charAt(random);
60
+ }
61
+ return generatedBoundary;
62
+ };
63
+
64
+ function generateNewBoundary(state) {
65
+ var newBoundary;
66
+ var boundaryIsPresentInTheList;
67
+ do {
68
+ newBoundary = exports.generateBoundary();
69
+ boundaryIsPresentInTheList = (state.usedBoundaries.indexOf(newBoundary) > -1);
70
+ } while (boundaryIsPresentInTheList);
71
+ state.usedBoundaries.push(newBoundary);
72
+ return newBoundary;
73
+ }
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var _ = require('lodash');
4
+
5
+ exports.parse = function(arg) {
6
+ var parsedContent = {};
7
+
8
+ if (_.isString(arg)) {
9
+ parseFromString(arg, parsedContent);
10
+ } else if (_.isArray(arg)) {
11
+ parseFromArrayOfStrings(arg, parsedContent);
12
+ } else {
13
+ throw new Error('SetCookieParser: case not supported. Pass either a string or an array.');
14
+ }
15
+
16
+ return parsedContent;
17
+ };
18
+
19
+ function parseFromString(str, parsedContent) {
20
+ var result = /([^=]+)=(.*)/.exec(str);
21
+ if (result && result.length === 3) {
22
+ var cookieName = result[1];
23
+ var cookieValue = result[2];
24
+ parsedContent[cookieName] = cookieValue;
25
+ }
26
+ }
27
+
28
+ function parseFromArrayOfStrings(arr, parsedContent) {
29
+ arr.forEach(function(singleCookie) {
30
+ parseFromString(singleCookie, parsedContent);
31
+ });
32
+ }
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var TextBundle = require('@sap/textbundle').TextBundle;
4
+ var utils = require('../utils');
5
+ var nodeUtils = require('util');
6
+ var fs = require('fs');
7
+ var path = require('path');
8
+ var assert = require('assert');
9
+
10
+ module.exports = TextBundleWrapperFactory;
11
+
12
+ function TextBundleWrapperFactory(xsRootDirs) {
13
+ assert(nodeUtils.isArray(xsRootDirs), 'Invalid root dirs parameter provided, array of directories expected');
14
+ this._xsRootDirs = xsRootDirs;
15
+ }
16
+
17
+ TextBundleWrapperFactory.prototype.loadBundle = function(sapPackage, file, locale) {
18
+ var modifiedPath;
19
+ var textBundlePath;
20
+ var i = 0;
21
+
22
+ for (i = 0; i < this._xsRootDirs.length; i++) {
23
+ modifiedPath = path.join(this._xsRootDirs[i], utils.toPath(sapPackage, file));
24
+ if (fs.existsSync(modifiedPath + '.hdbtextbundle')) {
25
+ textBundlePath = modifiedPath + '.hdbtextbundle';
26
+ } else if (fs.existsSync(modifiedPath + '.properties')) {
27
+ textBundlePath = modifiedPath + '.properties';
28
+ }
29
+ }
30
+ assert(textBundlePath, 'Could not find bundle ' + file + ' in package ' + sapPackage);
31
+ return new TextBundleWrapper(new TextBundle({ path: textBundlePath, locale: locale }));
32
+ };
33
+
34
+ function TextBundleWrapper(textBundle) {
35
+ this.textBundle = textBundle;
36
+ }
37
+
38
+ TextBundleWrapper.prototype.getText = function(key, args) {
39
+ var params = args;
40
+ if (typeof args === 'object' && !nodeUtils.isArray(args)) {
41
+ params = Object.keys(args).sort().map(function(element) {
42
+ return args[element];
43
+ });
44
+ }
45
+ return this.textBundle.getText(key, params);
46
+ };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var TextBundleWrapper = require('./TextBundleWrapper');
4
+ var sqlInjectionUtils = require('@sap/hdbext').sqlInjectionUtils;
5
+
6
+ module.exports = function(xsruntime) {
7
+ return {
8
+ 'sap.hana.xs.i18n.text' : new TextBundleWrapper(xsruntime.settings.rootDirs),
9
+ 'sap.hana.admin.common.lib.SQLInjectionUtils' : sqlInjectionUtils
10
+ };
11
+ };