Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

http proxy with Elixir. wait request with multi port and forward to each URIs

License

NotificationsYou must be signed in to change notification settings

KazuCocoa/http_proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Elixir CI

codecov

Simple multi HTTP Proxy using Plug. And support record/play requests.

MY GOAL

  • Record/Play proxied requests
    • http_proxy support multi port and multi urls on one execution commandmix proxy.
  • Support VCR

architecture

           http_proxyClient  (server  client)  proxied_server  |            |            |  | 1.request  |            |  |  ------>   | 2.request  |  |            |  ------>   |  |            |            |  |            | 3.response |  | 4.response |  <------   |  |  <------   |            |  |            |            |
  1. The client sends a request to http_proxy, then the http_proxy works as a proxy server.
  2. When the http_proxy receives the request from the client, then the http_proxy sends the request to a proxied server, e.g.http://google.com, as a client.
  3. The http_proxy receives responses from the proxied_server, then the http_proxy sets the response into its response to the client.
  4. The Client receives responses from the http_proxy.

Quick use as http proxy

requirement

  • Elixir over 1.7

set application and deps

  • mix.exs
    • :logger is option.
    • :http_proxy is not need if you run http_proxy withHttpProxy.start/0 orHttpProxy.stop/0 manually.
defapplicationdo[applications:[:logger,:http_proxy]]end...defpdepsdo[{:http_proxy,"~> 1.4.0"}]end

set configuration

  • config/config.exs
use Mix.Configconfig :http_proxy,  proxies: [             %{port: 8080,               to:   "http://google.com"},             %{port: 8081,               to:   "http://yahoo.com"}            ]
  • To manage logger, you should define logger settings like the following.
config :logger, :console,  level: :info

solve deps and run a server

$ mix deps.get$ mix clean$ mix run --no-halt # start proxy server

If you would like to start production mode, you should run withMIX_ENV=prod like the following command.

$ MIX_ENV=prod mix run --no-halt

launch browser

Launch browser and openhttp://localhost:8080 orhttp://localhost:8081.Then,http://localhost:8080 redirect tohttp://google.com andhttp://localhost:8081 do tohttp://yahoo.com.

Development

  • Copypre-commit hook
    • cp hooks/pre-commit ./git/hooks/pre-commit

Configuration

Customize proxy port

  • You can customize a proxy port. For example, if you change a waiting port from8080 to4000, then you can access tohttp://google.com viahttp://localhost:4000.
use Mix.Configconfig :http_proxy,  proxies: [             %{port: 4000,               to:   "http://google.com"},             %{port: 8081,               to:   "http://yahoo.com"}            ]

Add proxy

  • You can add a waiting ports in configuration file. For example, the following setting allow you to access tohttp://apple.com viahttp://localhost:8082 in addition.
use Mix.Configconfig :http_proxy,  proxies: [             %{port: 8080,               to:   "http://google.com"},             %{port: 8081,               to:   "http://yahoo.com"},             %{port: 8082,               to:   "http://apple.com"}            ]

Play and Record mode

  • When:record and:play arefalse, then the http_proxy works just multi port proxy.
  • When:record istrue, then the http_proxy works to record request which is proxied.
  • When:play istrue, then the http_proxy works to play request between this the http_proxy and clients.
useMix.Configconfig:http_proxy,proxies:[# MUST%{port:8080,# proxy all request even play or recordto:"http://google.com"},%{port:8081,to:"http://yahoo.com"}]timeout:20_000,# Option, ms to wait http request.record:false,# Option, true: record requests. false: don't record.play:false,# Option, true: play stored requests. false: don't play.export_path:"test/example",# Option, path to export recorded files.play_path:"test/data"# Option, path to read json files as response to.

Example

Record request as the following

{"request": {"headers": [],"method":"GET","options": {"aspect":"query_params"    },"remote":"127.0.0.1","request_body":"","url":"http://localhost:8080/hoge/inu?email=neko&pass=123"  },"response": {"body_file":"path/to/body_file.json","cookies": {},"headers": {"Cache-Control":"public, max-age=2592000","Content-Length":"251","Content-Type":"text/html; charset=UTF-8","Date":"Sat, 21 Nov 2015 00:37:38 GMT","Expires":"Mon, 21 Dec 2015 00:37:38 GMT","Location":"http://www.google.com/hoge/inu?email=neko&pass=123","Server":"sffe","X-Content-Type-Options":"nosniff","X-XSS-Protection":"1; mode=block"    },"status_code":301  }}

Response body will save in "path/to/body_file.json".

Play request with the following JSON data

  • Example ishttps://github.com/KazuCocoa/http_proxy/tree/master/test/data/mappings
  • You can setpath orpath_pattern as attribute underrequest.
    • Ifpath, the http_proxy check requests are matched completely.
    • Ifpath_pattern, the http_proxy check requests are matched with Regex.
  • You can setbody orbody_file as attribute underresponse.
    • Ifbody, the http_proxy send the body string.
    • Ifbody_file, the http_proxy send the body_file binary as response.

path andbody case

{"request": {"path":"/request/path","port":8080,"method":"GET"  },"response": {"body":"<html>hello world</html>","cookies": {},"headers": {"Content-Type":"text/html; charset=UTF-8","Server":"GFE/2.0"    },"status_code":200  }}

path_pattern andbody_file case

  • Pattern match withRegex.match?(Regex.compile!("\A/request.*neko\z"), request_path)
  • File.read/2 viafile/to/path.json and respond the binary
{"request": {"path_pattern":"\A/request.*neko\z","port":8080,"method":"GET"  },"response": {"body_file":"file/to/path.json","cookies": {},"headers": {"Content-Type":"text/html; charset=UTF-8","Server":"GFE/2.0"    },"status_code":200  }}

dependencies

$ mix xref graphlib/http_proxy.ex└── lib/http_proxy/supervisor.ex    ├── lib/http_proxy/agent.ex    │   ├── lib/http_proxy/play/data.ex    │   │   ├── lib/http_proxy/agent.ex    │   │   └── lib/http_proxy/play/response.ex    │   │       ├── lib/http_proxy/play/data.ex    │   │       └── lib/http_proxy/utils/file.ex    │   └── lib/http_proxy/play/paths.ex    │       ├── lib/http_proxy/agent.ex    │       └── lib/http_proxy/play/response.ex    └── lib/http_proxy/handle.ex        ├── lib/http_proxy/play/body.ex        ├── lib/http_proxy/play/data.ex        ├── lib/http_proxy/play/paths.ex        ├── lib/http_proxy/play/response.ex        └── lib/http_proxy/record/response.ex            ├── lib/http_proxy/format.ex            │   └── lib/http_proxy/data.ex (compile)            └── lib/http_proxy/utils/file.ex

TODO

styleguide

http://elixir.community/styleguide

LICENSE

MIT. Please read LICENSE.

About

http proxy with Elixir. wait request with multi port and forward to each URIs

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors4

  •  
  •  
  •  
  •  

[8]ページ先頭

©2009-2025 Movatter.jp