minion_rb 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2a3674471152c7c98e5d030421fef11f12ba22535e268b07fecd796b287fdc21
4
+ data.tar.gz: 0cd9e7a5d90564e02e50261de27656061165438e0688273cce4fb88191c468c5
5
+ SHA512:
6
+ metadata.gz: bdd3cf63edfc84422f2bf9ae392785a7ba5461b75c7a158a894f0a19477fa601b739bed8ea670cf099063bb4cfbe4d0cd8cf1e69e543f05e83cf5607f6c961f4
7
+ data.tar.gz: 590e0a301c09e8a05a7e8ddaa85bf85bf157cc56f3241f7550ed648eb91ae1ce4b570c4caaac96c348fad9ccd678422e6b4e5ec899d673aa66acc355d29608d0
@@ -0,0 +1,15 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ *.gem
14
+ certs
15
+ proxy.rb
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.5.0
5
+ before_install: gem install bundler -v 1.16.1
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ gemspec
@@ -0,0 +1,41 @@
1
+ # minion_rb
2
+
3
+ a dsl for proxying http traffic
4
+
5
+ ## Installation
6
+
7
+ ```rb
8
+ gem install minion_rb
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ `minion_rb` is built on top of [evil-proxy](https://github.com/bbtfr/evil-proxy) so you
14
+ must install the CA cert in your browser [as described here](https://github.com/bbtfr/evil-proxy#usage)
15
+ to function properly with HTTPS.
16
+
17
+ Once you've done that you'll need to write a driver script for the proxy.
18
+ Below is an example where I replace `fast.wistia.com/assets/app/stats-<SHA>.js` with
19
+ a local file by querying webpack-dev-server:
20
+
21
+ ```rb
22
+ # proxy.rb
23
+ require 'minion'
24
+
25
+ Minion.proxy do
26
+ host "fast.wistia.com" do
27
+ get /stats-[a-z0-9]*\.js$/ do |req, res|
28
+ require 'json'
29
+ manifest = JSON.parse(`curl 0.0.0.0:3001/assets/manifest.json`)
30
+ asset = manifest["assetsByChunkName"]["app/stats"]
31
+ res.body = `curl https://example2.wistia.dev/assets/#{asset}`
32
+ end
33
+ end
34
+ end.start
35
+ ```
36
+
37
+ Then run it with Ruby and hit your endpoint:
38
+
39
+ ```
40
+ ruby proxy.rb
41
+ ```
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "minion"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,57 @@
1
+ require "minion/version"
2
+ require "evil-proxy"
3
+
4
+ module Minion
5
+ def self.proxy(&block)
6
+ Minion::Instance.new.tap { |m| m.instance_eval(&block) }
7
+ end
8
+
9
+ class Instance
10
+ def initialize
11
+ @hosts = {}
12
+ end
13
+
14
+ def host(name, &block)
15
+ host = Minion::Host.new.tap { |h| h.instance_eval(&block) }
16
+ @hosts[name] = host
17
+ end
18
+
19
+ def start
20
+ mitm_pattern = /(#{@hosts.keys.map { |hostname| Regexp.escape(hostname) }.join('|')})/
21
+ proxy = EvilProxy::MITMProxyServer.new Port: 8080, MITMPattern: mitm_pattern
22
+ # todo - unsuckify
23
+ @hosts.each do |hostname, minion_host|
24
+ proxy.start_mitm_server(hostname, 0)
25
+ proxy.instance_eval { minion_host.apply(@mitm_servers[hostname]) }
26
+ end
27
+ proxy.start
28
+ end
29
+ end
30
+
31
+ class Host
32
+ def initialize
33
+ @handlers = {}
34
+ end
35
+
36
+ def get(expr, &block)
37
+ @handlers[:get] ||= []
38
+ @handlers[:get] << [expr, block]
39
+ end
40
+
41
+ def apply(mitm_server)
42
+ @handlers.each do |method, cases|
43
+ mitm_server.instance_eval do
44
+ define_singleton_method "do_#{method.upcase}" do |req, res|
45
+ match = cases.find { |(expr, _)| req.path =~ expr }
46
+ if match.nil?
47
+ super req, res
48
+ else
49
+ _, handler = match
50
+ handler.call(req, res)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module Minion
2
+ VERSION = "0.1.3"
3
+ end
@@ -0,0 +1,26 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "minion/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "minion_rb"
7
+ spec.version = Minion::VERSION
8
+ spec.authors = ["Josh Bodah"]
9
+ spec.email = ["joshuabodah@gmail.com"]
10
+
11
+ spec.summary = %q{a dsl for proxying http traffic}
12
+ spec.homepage = "https://github.com/jbodah/minion_rb"
13
+
14
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
15
+ f.match(%r{^(test|spec|features)/})
16
+ end
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.16"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec", "~> 3.0"
24
+
25
+ spec.add_dependency "evil-proxy", "~> 0.2"
26
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minion_rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Josh Bodah
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-07-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: evil-proxy
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.2'
69
+ description:
70
+ email:
71
+ - joshuabodah@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".travis.yml"
79
+ - Gemfile
80
+ - README.md
81
+ - Rakefile
82
+ - bin/console
83
+ - bin/setup
84
+ - lib/minion.rb
85
+ - lib/minion/version.rb
86
+ - minion_rb.gemspec
87
+ homepage: https://github.com/jbodah/minion_rb
88
+ licenses: []
89
+ metadata: {}
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 2.7.3
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: a dsl for proxying http traffic
110
+ test_files: []