0

I am requesting an index.djvu that fires requests for documents by id. The requests id that the index.djvu fires is Base64 encoded e.g document/page_1_1_1_k21g_MjE4MGstMTAvMTE=.djvu where the id is MjE4MGstMTAvMTE=. I need to encode the id before the requests is sent e.g encodeURIComponent('MjE4MGstMTAvMTE='). How can I get control over the requests that the index.djvu fires?

My code looks like this

var http = require('http');
var httpProxy = require('http-proxy');
var HttpProxyRules = require('http-proxy-rules');

var proxyRules = new HttpProxyRules({
  rules: {
    // This requests response index further requests explained
    '.*/document': 'https://api.service.xxx/document/index.djvu?archive=21&id=2180k-10/11'
  },
  default: 'https://api.service.xxx/document'
});

var proxy = httpProxy.createProxyServer({
  secure: false
});

proxy.on('proxyReq', function (proxyReq, req, res, options) {
  proxyReq.setHeader('Authorization', 'Bearer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx');

});

var server = {};
server.httpServer = http.createServer(function (req, res) {
  var target = proxyRules.match(req);
  if (target) {
    return proxy.web(req, res, {
      target: target
    });
  }
});

server.init = () => {
  server.httpServer.listen(9000, () => {
    console.log('\x1b[36m%s\x1b[0m', 'The HTTP server is running on port 9000');
  });
}
server.init();

server.httpServer.on('error', function (err) {
  console.log('Error http-server\n', JSON.stringify(err));
});

proxy.on('proxyRes', function (proxyRes, req, res) {
  console.log('Status: ' + proxyRes.statusCode + ' ' + proxyRes.statusMessage);
  proxyRes.on('data', function (chunk) {
    console.log('Body: ' + chunk.toString('utf8'));
  });
  console.log('Headers received from api: ', JSON.stringify(proxyRes.headers, true, 2));
});

All help is appreciated

0

1 Answer 1

0

This solved it after several hours of war ;)

var http = require('http');
var httpProxy = require('http-proxy');
var url = require('url');

var proxy = httpProxy.createProxyServer({
  target: 'https://api.xxxxxxxxxxxxxx.xxx',
  secure: false
}).listen(9000);

proxy.on('proxyReq', function (proxyReq, req, res, options) {
  proxyReq.setHeader('Authorization', 'Bearer xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx');
  var url_parts = url.parse(req.url);
  var str = url_parts.pathname;
  var query = url_parts.search;
  if (str) {
    var path = str.split("_");
    urlstring = {
      page_: path[0],
      vers: path[1],
      subdoc: path[2],
      page: path[3],
      archive: path[4],
      enc_id: path[5]
    }
  }
  var rewritedPath;
  if (str.includes('route')) {
    rewritedPath = '/xxx' + str;
  } else if (str.includes('route')) {
    var index = '/xxx' + str + query;
    rewritedPath = index;
  } else {
    var page = 'xxx' + urlstring.page_ + '_' + urlstring.vers + '_' + urlstring.subdoc + '_' + urlstring.page + '_' + urlstring.archive + '_' + encodeURIComponent(urlstring.enc_id);
    rewritedPath = page;
  }
  proxyReq.path = rewritedPath;
});

proxy.on('error', function (err, req, res) {
  console.log('Something went wrong.', err);
});

proxy.on('proxyRes', function (proxyRes, req, res) {
  // console.log('Status: ' + req.url + ' ' + proxyRes.statusMessage);
  // proxyRes.on('data', function (chunk) {
  //   console.log('Body: ' + chunk.toString('utf8'));
  // });
  // console.log('Headers: ', JSON.stringify(proxyRes.headers, true, 2));
});
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.