* Generic function to respond to user with data using streams * * @param {object} request - incoming request * @param {object} response - response object * @param {object} log - logging object * @param {BucketInfo} bucket - bucket info * @param {string} data - data to send * @param {date} [la
(request, response, log, bucket, data, lastModified)
| 127 | * @returns {Promise<void>} - |
| 128 | */ |
| 129 | async function respondWithData(request, response, log, bucket, data, lastModified) { |
| 130 | const dataBuffer = Buffer.from(data); |
| 131 | const responseMetaHeaders = getResponseHeader(request, bucket, dataBuffer, lastModified, log); |
| 132 | |
| 133 | if (responseMetaHeaders && typeof responseMetaHeaders === 'object') { |
| 134 | Object.keys(responseMetaHeaders).forEach(key => { |
| 135 | if (responseMetaHeaders[key] !== undefined) { |
| 136 | try { |
| 137 | response.setHeader(key, responseMetaHeaders[key]); |
| 138 | } catch (e) { |
| 139 | log.debug('header can not be added ' + |
| 140 | 'to the response', { |
| 141 | header: responseMetaHeaders[key], |
| 142 | error: e.stack, method: 'routeVeeam/respondWithData' |
| 143 | }); |
| 144 | } |
| 145 | } |
| 146 | }); |
| 147 | } |
| 148 | |
| 149 | response.writeHead(200); |
| 150 | |
| 151 | let contentLength = 0; |
| 152 | if (responseMetaHeaders && responseMetaHeaders['Content-Length']) { |
| 153 | contentLength = responseMetaHeaders['Content-Length']; |
| 154 | } |
| 155 | log.end().addDefaultFields({ contentLength }); |
| 156 | |
| 157 | try { |
| 158 | // Use a single-element array so the Buffer is sent as one chunk rather |
| 159 | // than being iterated byte-by-byte by Readable.from. |
| 160 | await pipeline(Readable.from([dataBuffer]), response); |
| 161 | log.end().info('responded with streamed content', { |
| 162 | httpCode: response.statusCode, |
| 163 | }); |
| 164 | } catch (err) { |
| 165 | log.end().error('error streaming response', { |
| 166 | httpCode: response.statusCode, |
| 167 | error: err.message, |
| 168 | }); |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | const validPath = '.system-d26a9498-cb7c-4a87-a44a-8ae204f5ba6c/'; |
| 173 |
no test coverage detected