rack_curler 0.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZGNkNTdlM2QzMGRiZjY1NTM1ODkyZTI0YTQ4ZTEwYjJkZGM0MmYyNw==
5
+ data.tar.gz: !binary |-
6
+ MDg5YTc2ZTU0ZDczYjU3ZmQyNDA5MjRlNzg1MDgzMGJkM2FjMDUzOQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MDkwN2E2NjBlYjgzNDkyZWRiZjhkOTk4NGZjYTRlOGRlNWEwNjIzMmVlMWIw
10
+ N2QzMmM2MDkwZGU5MjY2MWJmMGYxZDY0Zjk0YWU0NjMzOTE0YmM0OGM1Mjc0
11
+ OWFhNDIwMGY4ODZjNjhmMzlkN2M5MmZiMzNhNWNmZTViMmEwZWE=
12
+ data.tar.gz: !binary |-
13
+ YzViOTZiYmRmNmM5OTQ2MzU1YjFkY2E1OTIyMDNlYmIyMDU1MDU5MDRiZjVj
14
+ OWNiNTIxMDMxOGM1NmYxZTZjNmNmZGZmMDRhOGRjZTc2N2NjMDJlZWFmNjA0
15
+ YTQ2NGIzZmJmZGJjMjZiODc3YTZlOTQyYjFkNzk0MDI4Njk3M2Y=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ rack_curler
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-1.9.3-p448
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rack_curler.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Nathan Speed
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # RackCurler
2
+
3
+ Given a Rack env, generate a nicely formatted curl command that approximates the request. Suitable for debugging.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rack_curler'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rack_curler
18
+
19
+ ## Usage
20
+
21
+ Where ```env``` is a Rack env:
22
+
23
+ RackCurler.to_curl(env)
24
+
25
+ Will output something like (depending on the request):
26
+
27
+ curl 'https://foo.example.com/hello/times' \
28
+ -X PUT
29
+ -H 'X-Forwarded-For: 127.0.0.1' \
30
+ -H 'X-Forwarded-Proto: https' \
31
+ -H 'Authorization: Basic laiusdfhalnsidufhxalnsuhflsadufhxadlsunxdsauhnlaudflnsuhadsf==' \
32
+ -H 'Accept: application/json' \
33
+ -H 'Cookie: crazy_cookie=alskdjfhasldkjfhxalsdufhxwoeufhxa; normal_cookie=asdfsadhfjlkdsajflksadjfh;'
34
+ --data 'super awesome request body'
35
+
36
+ ## Contributing
37
+
38
+ 1. Fork it
39
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
40
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
41
+ 4. Push to the branch (`git push origin my-new-feature`)
42
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ module RackCurler
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,44 @@
1
+ require "rack_curler/version"
2
+
3
+ module RackCurler
4
+ def self.to_curl(env)
5
+
6
+ headers_to_drop = [
7
+ 'Version', # make your life easy and let curl set this
8
+ 'Content-Length', # curl will set this for you
9
+ 'Host', # curl will set this for you
10
+ 'Connection', # curl will set this for you
11
+ 'Accept-Encoding', # for debugging, you don't want an encoded-response
12
+ 'Date' # it would be incorrect to repeat
13
+ ]
14
+
15
+ header_defaults = {
16
+ 'Accept' => '*/*',
17
+ 'Content-Type' => 'application/x-www-form-urlencoded'
18
+ }
19
+
20
+ env['rack.input'].rewind
21
+ body = env['rack.input'].read
22
+ env['rack.input'].rewind
23
+
24
+ headerize = lambda { |raw| raw.split(/[ _\-]/).map(&:capitalize).join('-') }
25
+
26
+ headers = {}.tap do |h|
27
+ env.select { |k, v| k =~ /^HTTP_/ || k == 'CONTENT_TYPE' }
28
+ .each { |k, v| h[headerize.call(k.sub(/^HTTP_/, ''))] = v}
29
+ h.select! { |k, v| !headers_to_drop.member?(k) }
30
+ h.select! { |k, v| header_defaults[k].nil? || header_defaults[k] != v }
31
+ end
32
+
33
+ url = Rack::Request.new(env).url
34
+
35
+ curl_command = "curl '#{url}'"
36
+ curl_command << " \\\n -X #{env['REQUEST_METHOD']}" unless ['GET', 'POST'].member?(env['REQUEST_METHOD'])
37
+ headers.each_pair do |header, value|
38
+ curl_command << " \\\n -H '#{header}: #{value}'"
39
+ end
40
+ curl_command << " \\\n --data '#{body}'" if body && !body.empty?
41
+
42
+ curl_command
43
+ end
44
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rack_curler/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rack_curler"
8
+ spec.version = RackCurler::VERSION
9
+ spec.authors = ["Nathan Speed"]
10
+ spec.email = ["speedarius@gmail.com"]
11
+ spec.description = %q{Generate curl commands that approximate rack requests.}
12
+ spec.summary = %q{Given a rack env, generate a prettified curl command that approximates the request, including headers and request body. Suitable for debugging.}
13
+ spec.homepage = "https://github.com/speedarius/rack_curler"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "rack"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec", "~> 2.6"
26
+ end
@@ -0,0 +1,161 @@
1
+ require 'rack_curler'
2
+ require 'rack/mock'
3
+
4
+ describe RackCurler do
5
+ it "has a version" do
6
+ RackCurler::VERSION.should_not be_nil
7
+ end
8
+
9
+ describe "to_curl" do
10
+ before(:each) do
11
+ @get_env = lambda do |options={}|
12
+ env = Rack::MockRequest.env_for('http://foo.example.com', options)
13
+ env['HTTP_VERSION'] = '1.2.3.4'
14
+ env['HTTP_HOST'] = 'foo.example.com'
15
+ env['HTTP_CONNECTION'] = 'close'
16
+ env['HTTP_ACCEPT_ENCODING'] = 'deflate, gzip'
17
+ env['HTTP_DATE'] = '2013-11-06 16:52:05 -0800'
18
+ env['HTTP_ACCEPT'] = '*/*'
19
+ env['HTTP_SOME_OTHER_HEADER'] = 'header value 123'
20
+ env
21
+ end
22
+ end
23
+
24
+ shared_examples_for "a request for http://foo.example.com" do
25
+ it "is a curl command" do
26
+ @output.should match /^curl /
27
+ end
28
+
29
+ it "has a url argument of http://foo.example.com" do
30
+ @output.should match /^curl 'http:\/\/foo\.example\.com\/?'/
31
+ end
32
+
33
+ it "does not specify a Version header (curl should choose this)" do
34
+ @output.should_not match /-H 'Version:/
35
+ end
36
+
37
+ it "does not specify a Host header (curl does this for you)" do
38
+ @output.should_not match /-H 'Host:/
39
+ end
40
+
41
+ it "does not specify a Connection header (curl does this for you)" do
42
+ @output.should_not match /-H 'Connection:/
43
+ end
44
+
45
+ it "does not specify an Accept-Encoding header (for debugging, you don't want an encoded response)" do
46
+ @output.should_not match /-H 'Accept-Encoding:/
47
+ end
48
+
49
+ it "does not specify a Date header (curl will do this for you)" do
50
+ @output.should_not match /-H 'Date:/
51
+ end
52
+
53
+ it "does not have a redundant Accept header (curl will use */* by default)" do
54
+ @output.should_not match /-H 'Accept:/
55
+ end
56
+
57
+ it "does include any other header" do
58
+ @output.should match /-H 'Some-Other-Header: header value 123'/
59
+ end
60
+
61
+ describe 'with non-default Accept' do
62
+ before(:each) do
63
+ @env['HTTP_ACCEPT'] = 'something specific'
64
+ @output = RackCurler.to_curl(@env)
65
+ end
66
+
67
+ it "does include the Accept header" do
68
+ @output.should match /-H 'Accept: something specific'/
69
+ end
70
+ end
71
+ end
72
+
73
+ shared_examples_for "a request for http://foo.example.com without a body" do
74
+ it "does not have a --data argument" do
75
+ @output.should_not match /--data/
76
+ end
77
+ end
78
+
79
+ shared_examples_for "a request for http://foo.example.com with a body" do
80
+ it "does not specify a Content-Length header (curl will set this for you)" do
81
+ @output.should_not match /-H 'Content-Length:/
82
+ end
83
+
84
+ it "does not specify a redundant Content-Type header (curl will assume application/x-www-form-urlencoded)" do
85
+ @output.should_not match /-H 'Content-Type:/
86
+ end
87
+
88
+ it "includes the body in a --data argument" do
89
+ @output.should match /--data 'some body'/
90
+ end
91
+
92
+ describe 'with non-default Content-Type' do
93
+ before(:each) do
94
+ @env['CONTENT_TYPE'] = 'hello'
95
+ @output = RackCurler.to_curl(@env)
96
+ end
97
+
98
+ it "does specify a Content-Type header" do
99
+ @output.should match /-H 'Content-Type: hello'/
100
+ end
101
+ end
102
+ end
103
+
104
+ describe 'for a GET to http://foo.example.com' do
105
+ before(:each) do
106
+ @env = @get_env.call :method => 'GET'
107
+ @output = RackCurler.to_curl(@env)
108
+ end
109
+
110
+ it_behaves_like "a request for http://foo.example.com"
111
+ it_behaves_like "a request for http://foo.example.com without a body"
112
+
113
+ it "does not have a -X argument (curl will assume it is a GET)" do
114
+ @output.should_not match /-X GET/
115
+ end
116
+ end
117
+
118
+ describe 'for a DELETE to http://foo.example.com' do
119
+ before(:each) do
120
+ @env = @get_env.call :method => 'DELETE'
121
+ @output = RackCurler.to_curl(@env)
122
+ end
123
+
124
+ it_behaves_like "a request for http://foo.example.com"
125
+ it_behaves_like "a request for http://foo.example.com without a body"
126
+
127
+ it "specifies -X DELETE" do
128
+ @output.should match /-X DELETE/
129
+ end
130
+ end
131
+
132
+ describe 'for a PUT to http://foo.example.com' do
133
+ before(:each) do
134
+ @env = @get_env.call :method => 'PUT', :input => 'some body'
135
+ @output = RackCurler.to_curl(@env)
136
+ end
137
+
138
+ it_behaves_like "a request for http://foo.example.com"
139
+ it_behaves_like "a request for http://foo.example.com with a body"
140
+
141
+ it "specifies -X PUT" do
142
+ @output.should match /-X PUT/
143
+ end
144
+ end
145
+
146
+ describe 'for a POST to http://foo.example.com' do
147
+ before(:each) do
148
+ @env = @get_env.call :method => 'POST', :input => 'some body'
149
+ @output = RackCurler.to_curl(@env)
150
+ end
151
+
152
+ it_behaves_like "a request for http://foo.example.com"
153
+ it_behaves_like "a request for http://foo.example.com with a body"
154
+
155
+ it "does not specify -X POST (curl will assume it is a POST)" do
156
+ @output.should_not match /-X POST/
157
+ end
158
+ end
159
+ end
160
+ end
161
+
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack_curler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Speed
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '2.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '2.6'
69
+ description: Generate curl commands that approximate rack requests.
70
+ email:
71
+ - speedarius@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .ruby-gemset
78
+ - .ruby-version
79
+ - Gemfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - lib/rack_curler.rb
84
+ - lib/rack_curler/version.rb
85
+ - rack_curler.gemspec
86
+ - spec/rack_curler_spec.rb
87
+ homepage: https://github.com/speedarius/rack_curler
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.1.10
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Given a rack env, generate a prettified curl command that approximates the
111
+ request, including headers and request body. Suitable for debugging.
112
+ test_files:
113
+ - spec/rack_curler_spec.rb