134 lines
4.3 KiB
JavaScript
134 lines
4.3 KiB
JavaScript
/**
|
|
* CORS Anywhere is designed for use as a standalone server. Sometimes you want
|
|
* to have extra functionality on top of the default CORS server. If it may be
|
|
* useful to others, please open a feature request on the issue tracker at
|
|
* https://github.com/Rob--W/cors-anywhere/issues.
|
|
*
|
|
* If it is only useful to your application, look below for some examples.
|
|
* These examples are provided as-is without guarantees. Use at your own risk.
|
|
*/
|
|
|
|
/* eslint-env mocha */
|
|
require('./setup');
|
|
|
|
var createServer = require('../').createServer;
|
|
var assert = require('assert');
|
|
var request = require('supertest');
|
|
|
|
var http = require('http');
|
|
|
|
describe('Examples', function() {
|
|
// Note: In the examples below we don't listen on any port after calling
|
|
// createServer() because it is not needed to start listening on a port if the
|
|
// CORS Anywhere is only used internally.
|
|
|
|
// And normally you have to listen on some port, like this:
|
|
//
|
|
// http_server.listen(port_number);
|
|
//
|
|
// But in these test, the call to request() automatically handles that part so
|
|
// the examples don't have an explicit .listen() call.
|
|
|
|
it('Rewrite proxy URL', function(done) {
|
|
var cors_anywhere = createServer();
|
|
|
|
var http_server = http.createServer(function(req, res) {
|
|
// For testing, check whether req.url is the same as what we input below.
|
|
assert.strictEqual(req.url, '/dummy-for-testing');
|
|
|
|
// Basic example: Always proxy example.com.
|
|
req.url = '/http://example.com';
|
|
|
|
cors_anywhere.emit('request', req, res);
|
|
});
|
|
|
|
request(http_server)
|
|
.get('/dummy-for-testing')
|
|
.expect('Access-Control-Allow-Origin', '*')
|
|
.expect('x-request-url', 'http://example.com/')
|
|
.expect(200, 'Response from example.com', done);
|
|
});
|
|
|
|
it('Transform response to uppercase (streaming)', function(done) {
|
|
var cors_anywhere = createServer();
|
|
|
|
var http_server = http.createServer(function(req, res) {
|
|
var originalWrite = res.write;
|
|
|
|
res.write = function(data, encoding, callback) {
|
|
if (Buffer.isBuffer(data)) {
|
|
data = data.toString();
|
|
}
|
|
|
|
assert.strictEqual(typeof data, 'string');
|
|
|
|
// This example shows how to transform the response to upper case.
|
|
data = data.toUpperCase();
|
|
|
|
originalWrite.call(this, data, encoding, callback);
|
|
};
|
|
|
|
cors_anywhere.emit('request', req, res);
|
|
});
|
|
|
|
request(http_server)
|
|
.get('/example.com')
|
|
.expect('Access-Control-Allow-Origin', '*')
|
|
.expect('x-request-url', 'http://example.com/')
|
|
.expect(200, 'RESPONSE FROM EXAMPLE.COM', done);
|
|
});
|
|
|
|
it('Transform response to uppercase (buffered)', function(done) {
|
|
var cors_anywhere = createServer();
|
|
|
|
var http_server = http.createServer(function(req, res) {
|
|
var originalWrite = res.write;
|
|
var originalEnd = res.end;
|
|
|
|
var buffers = [];
|
|
|
|
res.write = function(data, encoding, callback) {
|
|
assert.ok(Buffer.isBuffer(data) || typeof data === 'string');
|
|
|
|
buffers.push(data);
|
|
if (callback) {
|
|
process.nextTick(callback, null);
|
|
}
|
|
};
|
|
res.end = function(data, encoding, callback) {
|
|
if (data) {
|
|
this.write(data, encoding);
|
|
}
|
|
|
|
// After calling .end(), .write shouldn't be called any more. So let's
|
|
// restore it so that the default error handling for writing to closed
|
|
// streams would occur.
|
|
this.write = originalWrite;
|
|
|
|
// Combine all chunks. Note that we're assuming that all chunks are
|
|
// utf8 strings or buffers whose content is utf8-encoded. If this
|
|
// assumption is not true, then you have to update the .write method
|
|
// above.
|
|
data = buffers.join('');
|
|
|
|
// This example shows how to transform the response to upper case.
|
|
data = data.toUpperCase();
|
|
|
|
// .end should be called once, so let's restore it so that any default
|
|
// error handling occurs if it occurs again.
|
|
this.end = originalEnd;
|
|
this.end(data, 'utf8', callback);
|
|
};
|
|
|
|
cors_anywhere.emit('request', req, res);
|
|
});
|
|
|
|
request(http_server)
|
|
.get('/example.com')
|
|
.expect('Access-Control-Allow-Origin', '*')
|
|
.expect('x-request-url', 'http://example.com/')
|
|
.expect(200, 'RESPONSE FROM EXAMPLE.COM', done);
|
|
});
|
|
});
|
|
|