• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

nsimmons/koa-better-http-proxy: Proxy middleware for Koa. Based on villadora/exp ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

nsimmons/koa-better-http-proxy

开源软件地址:

https://github.com/nsimmons/koa-better-http-proxy

开源编程语言:

JavaScript 100.0%

开源软件介绍:

koa-better-http-proxy Build Status Downloads

KoaJs Slack

Koa middleware to proxy request to another host and pass response back. Based on express-http-proxy.

Install

$ npm install koa-better-http-proxy --save

Usage

proxy(host, options);

To proxy URLS to the host 'www.google.com':

var proxy = require('koa-better-http-proxy');
var Koa = require('koa');

var app = new Koa();
app.use(proxy('www.google.com'));

If you wish to proxy only specific paths, you can use a router middleware to accomplish this. See Koa routing middlewares.

Options

agent

Use a custom http.Agent for proxy requests.

var agent = new http.Agent(options);
app.use(proxy('www.google.com', {
  agent: agent,
}));

port

The port to use for the proxied host.

app.use(proxy('www.google.com', {
  port: 443
}));

headers

Additional headers to send to the proxied host.

app.use(proxy('www.google.com', {
  headers: {
    'X-Special-Header': 'true'
  }
}));

strippedHeaders

Headers to remove from proxy response.

app.use(proxy('www.google.com', {
  strippedHeaders: [
    'set-cookie'
  ]
}));

preserveReqSession

Pass the session along to the proxied request

app.use(proxy('www.google.com', {
  preserveReqSession: true
}));

proxyReqPathResolver (supports Promises)

Provide a proxyReqPathResolver function if you'd like to operate on the path before issuing the proxy request. Use a Promise for async operations.

app.use(proxy('localhost:12345', {
  proxyReqPathResolver: function(ctx) {
    return require('url').parse(ctx.url).path;
  }
}));

Promise form

app.use(proxy('localhost:12345', {
  proxyReqPathResolver: function(ctx) {
    return new Promise(function (resolve, reject) {
      setTimeout(function () {   // do asyncness
        resolve(fancyResults);
      }, 200);
    });
  }
}));

filter

The filter option can be used to limit what requests are proxied. Return true to execute proxy.

For example, if you only want to proxy get request:

app.use(proxy('www.google.com', {
  filter: function(ctx) {
     return ctx.method === 'GET';
  }
}));

userResDecorator (supports Promise)

You can modify the proxy's response before sending it to the client.

exploiting references

The intent is that this be used to modify the proxy response data only.

Note: The other arguments (proxyRes, ctx) are passed by reference, so you can currently exploit this to modify either response's headers, for instance, but this is not a reliable interface. I expect to close this exploit in a future release, while providing an additional hook for mutating the userRes before sending.

userResHeadersDecorator (supports Promise)

You can modify the proxy's headers before sending it to the client.

gzip responses

If your proxy response is gzipped, this program will automatically unzip it before passing to your function, then zip it back up before piping it to the user response. There is currently no way to short-circuit this behavior.

app.use(proxy('www.google.com', {
  userResDecorator: function(proxyRes, proxyResData, ctx) {
    data = JSON.parse(proxyResData.toString('utf8'));
    data.newProperty = 'exciting data';
    return JSON.stringify(data);
  }
}));
app.use(proxy('httpbin.org', {
  userResDecorator: function(proxyRes, proxyResData) {
    return new Promise(function(resolve) {
      proxyResData.funkyMessage = 'oi io oo ii';
      setTimeout(function() {
        resolve(proxyResData);
      }, 200);
    });
  }
}));

limit

This sets the body size limit (default: 1mb). If the body size is larger than the specified (or default) limit, a 413 Request Entity Too Large error will be returned. See bytes.js for a list of supported formats.

app.use(proxy('www.google.com', {
  limit: '5mb'
}));

proxyReqOptDecorator (supports Promise form)

You can mutate the request options before sending the proxyRequest. proxyReqOpt represents the options argument passed to the (http|https).request module.

NOTE: req.path cannot be changed via this method; use proxyReqPathResolver instead.

app.use(proxy('www.google.com', {
  proxyReqOptDecorator: function(proxyReqOpts, ctx) {
    // you can update headers
    proxyReqOpts.headers['content-type'] = 'text/html';
    // you can change the method
    proxyReqOpts.method = 'GET';
    return proxyReqOpts;
  }
}));

You can use a Promise for async style.

app.use(proxy('www.google.com', {
  proxyReqOptDecorator: function(proxyReqOpts, ctx) {
    return new Promise(function(resolve, reject) {
      proxyReqOpts.headers['content-type'] = 'text/html';
      resolve(proxyReqOpts);
    })
  }
}));

proxyReqBodyDecorator (supports Promise form)

You can mutate the body content before sending the proxyRequest.

app.use(proxy('www.google.com', {
  proxyReqBodyDecorator: function(bodyContent, ctx) {
    return bodyContent.split('').reverse().join('');
  }
}));

You can use a Promise for async style.

app.use(proxy('www.google.com', {
  proxyReqBodyDecorator: function(proxyReq, ctx) {
    return new Promise(function(resolve, reject) {
      http.get('http://dev/null', function (err, res) {
        if (err) { reject(err); }
        resolve(res);
      });
    })
  }
}));

https

Normally, your proxy request will be made on the same protocol as the original request. If you'd like to force the proxy request to be https, use this option.

app.use(proxy('www.google.com', {
  https: true
}));

preserveHostHdr

You can copy the host HTTP header to the proxied express server using the preserveHostHdr option.

app.use(proxy('www.google.com', {
  preserveHostHdr: true
}));

parseReqBody

The parseReqBody option allows you to control parsing the request body. For example, disabling body parsing is useful for large uploads where it would be inefficient to hold the data in memory.

This defaults to true in order to preserve legacy behavior.

When false, no action will be taken on the body and accordingly req.body will no longer be set.

Note that setting this to false overrides reqAsBuffer and reqBodyEncoding below.

app.use(proxy('www.google.com', {
  parseReqBody: false
}));

reqAsBuffer

Note: this is an experimental feature. ymmv

The reqAsBuffer option allows you to ensure the req body is encoded as a Node Buffer when sending a proxied request. Any value for this is truthy.

This defaults to to false in order to preserve legacy behavior. Note that the value of reqBodyEnconding is used as the encoding when coercing strings (and stringified JSON) to Buffer.

Ignored if parseReqBody is set to false.

app.use(proxy('www.google.com', {
  reqAsBuffer: true
}));

reqBodyEncoding

Encoding used to decode request body. Defaults to utf-8.

Use null to preserve as Buffer when proxied request body is a Buffer. (e.g image upload) Accept any values supported by raw-body.

The same encoding is used in the userResDecorator method.

Ignored if parseReqBody is set to false.

app.use(proxy('httpbin.org', {
  reqBodyEncoding: null
}));

connectTimeout

By default, node does not express a timeout on connections. Use connectTimeout option to impose a specific timeout on the inital connection. (connect for http requests and secureConnect for https) This is useful if there are dns, network issues, or if you are uncertain if the destination is reachable. Timed-out requests will respond with 504 status code and a X-Timeout-Reason header.

app.use(proxy('httpbin.org', {
  connectTimeout: 2000  // in milliseconds, two seconds
}));

timeout

By default, node does not express a timeout on connections. Use timeout option to impose a specific timeout. This includes the time taken to make the connection and can be used with or without connectTimeout. Timed-out requests will respond with 504 status code and a X-Timeout-Reason header.

app.use(proxy('httpbin.org', {
  timeout: 2000  // in milliseconds, two seconds
}));



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
clintmod/koa-jwt-login-example: koa koa-jwt login example发布时间:2022-06-24
下一篇:
koajs/todo: a todo example write with koa and react发布时间:2022-06-24
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap