mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Reviewed By: davidaurelio Differential Revision: D4148018 fbshipit-source-id: 051cba96b2c4ac74709d45c2b388632122009c84
85 lines
2.0 KiB
JavaScript
85 lines
2.0 KiB
JavaScript
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
'use strict';
|
|
|
|
const CRLF = '\r\n';
|
|
const BOUNDARY = '3beqjf3apnqeu3h5jqorms4i';
|
|
|
|
class MultipartResponse {
|
|
static wrap(req, res) {
|
|
if (acceptsMultipartResponse(req)) {
|
|
return new MultipartResponse(res);
|
|
}
|
|
// Ugly hack, ideally wrap function should always return a proxy
|
|
// object with the same interface
|
|
res.writeChunk = () => {}; // noop
|
|
return res;
|
|
}
|
|
|
|
constructor(res) {
|
|
this.res = res;
|
|
this.headers = {};
|
|
|
|
res.writeHead(200, {
|
|
'Content-Type': `multipart/mixed; boundary="${BOUNDARY}"`,
|
|
});
|
|
res.write('If you are seeing this, your client does not support multipart response');
|
|
}
|
|
|
|
writeChunk(headers, data, isLast = false) {
|
|
let chunk = `${CRLF}--${BOUNDARY}${CRLF}`;
|
|
if (headers) {
|
|
chunk += MultipartResponse.serializeHeaders(headers) + CRLF + CRLF;
|
|
}
|
|
|
|
if (data) {
|
|
chunk += data;
|
|
}
|
|
|
|
if (isLast) {
|
|
chunk += `${CRLF}--${BOUNDARY}--${CRLF}`;
|
|
}
|
|
|
|
this.res.write(chunk);
|
|
}
|
|
|
|
writeHead(status, headers) {
|
|
// We can't actually change the response HTTP status code
|
|
// because the headers have already been sent
|
|
this.setHeader('X-Http-Status', status);
|
|
if (!headers) {
|
|
return;
|
|
}
|
|
for (const key in headers) {
|
|
this.setHeader(key, headers[key]);
|
|
}
|
|
}
|
|
|
|
setHeader(name, value) {
|
|
this.headers[name] = value;
|
|
}
|
|
|
|
end(data) {
|
|
this.writeChunk(this.headers, data, true);
|
|
this.res.end();
|
|
}
|
|
|
|
static serializeHeaders(headers) {
|
|
return Object.keys(headers)
|
|
.map((key) => `${key}: ${headers[key]}`)
|
|
.join(CRLF);
|
|
}
|
|
}
|
|
|
|
function acceptsMultipartResponse(req) {
|
|
return req.headers && req.headers.accept === 'multipart/mixed';
|
|
}
|
|
|
|
module.exports = MultipartResponse;
|