понедельник, 26 июня 2017 г.

NodeJS HTTP Proxy

Файл http-proxy.js

var otherServerAnswer = Buffer.from(
      JSON.stringify(
          {data: [1, 2, 3]} // Ваши данные, которые вы хотите передать.
      )
    , 'utf-8'
);

var proxyURL = '/get/data' // null <-- Адрес, при запросе по которому, вы хотите передать ваши данные или null, если вам не нужна возврат ваших данных в ответ на запрос по указанном адресу.
    , proxyServerHostname = '127.0.0.5' // Адрес промежуточного сервера.
    , proxyServerPort = 80
    , otherServerHostname = '127.0.0.1' // Адрес целевого сервера.
    , otherServerPort = 8080;

var http = require('http')
    , url = require('url');

var proxyServer = http.createServer(function (browserRequest, proxyServerResponse) {

    console.log('Browser request: ' + browserRequest.method + ' ' + browserRequest.url);

    var browserURL = url.parse(browserRequest.url);

    var options = {
          headers: browserRequest.headers
        , method: browserRequest.method
        , hostname: otherServerHostname
        , port: otherServerPort
        , path: browserURL.path
    };

    var proxyServerRequest = http.request(options);

    browserRequest.on('data', function (chunk) {proxyServerRequest.write(chunk, 'binary');});
    browserRequest.on('end', function () {proxyServerRequest.end();});
    browserRequest.on('error', function (error) {console.log('Error with browser request: ' + error);});

    proxyServerRequest.on('response', function (otherServerResponse) {
        if (typeof browserRequest.url === 'string' && browserRequest.url === proxyURL) {
            otherServerResponse.headers['content-length'] = Buffer.byteLength(otherServerAnswer);
            proxyServerResponse.writeHead(otherServerResponse.statusCode, otherServerResponse.headers);
            proxyServerResponse.end(otherServerAnswer, 'binary');
        } else {
            var chunks = [];
            otherServerResponse.on('data', function (chunk) {
                // Закомментированные строки для проверки правильности передачи данных.
                // Конвертация из бинарных данных в строку и обратно.
                // chunk = chunk.toString('utf-8');
                // chunk = JSON.parse(chunk);
                // chunk = JSON.stringify(chunk);
                // chunk = Buffer.from(chunk, 'utf-8');
                // console.log(Buffer.byteLength(chunk));
                chunks.push(chunk);
            });
            otherServerResponse.on('end', function () {
                // console.log(Buffer.concat(chunks).toString('utf-8'));
                proxyServerResponse.writeHead(otherServerResponse.statusCode, otherServerResponse.headers);
                proxyServerResponse.end(Buffer.concat(chunks), 'binary');
            });
        }
        otherServerResponse.on('error', function (error) {console.log('Error with other server response: ' + error);});
    });
    proxyServerRequest.on('error', function (error) {console.log('Error with other proxy server request: ' + error);});

});

proxyServer.listen(proxyServerPort, proxyServerHostname, function (error) {
    if (error) {throw error;}
    console.log('Proxy server started at ' + proxyServerHostname + ':' + proxyServerPort);
});

////////////////////////////////////////////////////////////////////////////////
/* Пример кода целевого сервера для тестирования работы промежуточного сервера.
var otherServer = http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/html'});
    response.write('OK');
    response.end('BYE');
});

otherServer.listen(otherServerPort, otherServerHostname, function (error) {
    if (error) {throw error;}
    console.log('Other server started at ' + otherServerHostname + ':' + otherServerPort);
});
*/

Комментариев нет:

Отправить комментарий