curlyrest 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6c791b7fd11f32fcb9586ac3efbe1d61c90034a4
4
- data.tar.gz: d1012f06a4a2a0175a59b794f59f91b27d289708
3
+ metadata.gz: 54902872b74e49ac70c0bd17b7926201b3c2cad5
4
+ data.tar.gz: b2aac6b7a50b8e8486dda7371ada5595c33f28a6
5
5
  SHA512:
6
- metadata.gz: 6cb1d4ee7bd9b154e8ddadd915cec6f691b223c20c68bdd691336d4e40c82bd19d0286aec073b31fb2f7e0447684dac454913168282b0660322bb6468188f54c
7
- data.tar.gz: 4df68565566d8c126e1270bba6be462e24aa13a6ccac4cab31954db013fadc01441b8e7b8220e4003efc189ebc5740cda8a4d158ac3ab49238f6ed293b23e8b2
6
+ metadata.gz: 46e7d713f5b9734cded5088f7621cd3b8a0e7e83d52f1a898f3610acd74b3f013ea81c4a7de3f705e0e9d50f43cf14af260327655108573c10cd05ffbdbb3bf4
7
+ data.tar.gz: e82472c2182851627e2261abe82628f9140862c0a3f492636d54c36262df2443b40315bf81549c0aee9c2c245768845c4055af3d5744287d3cdbd47819d3deb9
data/.rubocop.yml ADDED
@@ -0,0 +1,24 @@
1
+ Style/FrozenStringLiteralComment:
2
+ Enabled: false
3
+
4
+ Metrics/BlockLength:
5
+ Exclude:
6
+ - 'Rakefile'
7
+ - '**/*.rake'
8
+ - 'spec/**/*.rb'
9
+ - '*.gemspec'
10
+
11
+ Metrics/MethodLength:
12
+ Exclude:
13
+ - 'bin/*'
14
+
15
+ Metrics/ModuleLength:
16
+ Exclude:
17
+ - 'Rakefile'
18
+ - '**/*.rake'
19
+ - 'spec/**/*.rb'
20
+ - 'bin/*'
21
+
22
+ Metrics/ClassLength:
23
+ Exclude:
24
+ - 'bin/*'
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ curlyrest
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.4.1
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source 'https://rubygems.org'
2
+ gem 'simplecov', require: false, group: :test
2
3
 
3
4
  # Specify your gem's dependencies in curlyrest.gemspec
4
5
  gemspec
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
data/curlyrest.gemspec CHANGED
@@ -1,27 +1,31 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'curlyrest/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "curlyrest"
6
+ spec.name = 'curlyrest'
8
7
  spec.version = Curlyrest::VERSION
9
- spec.authors = ["Keith Williams"]
10
- spec.email = ["keithrw@comcast.net"]
8
+ spec.authors = ['Keith Williams']
9
+ spec.email = ['keithrw@comcast.net']
11
10
 
12
- spec.summary = 'gem extending rest-client, allowing use/debug of curl for request'
13
- spec.description = 'gem extending rest-client, allowing use/debug of curl for request'
14
- spec.homepage = "https://github.com/keithrw54/curlyrest.git"
15
- spec.license = "MIT"
11
+ spec.summary =
12
+ 'gem extending rest-client, allowing use/debug of curl for request'
13
+ spec.description =
14
+ 'gem extending rest-client, allowing use/debug of curl for request'
15
+ spec.homepage = 'https://github.com/keithrw54/curlyrest.git'
16
+ spec.license = 'MIT'
16
17
 
17
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
- spec.bindir = "exe"
18
+ spec.files =
19
+ `git ls-files -z`.split("\x0").reject do |f|
20
+ f.match(%r{^(test|spec|features)/})
21
+ end
22
+ spec.bindir = 'exe'
19
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
- spec.require_paths = ["lib"]
24
+ spec.require_paths = ['lib']
21
25
 
22
- spec.add_development_dependency "bundler", "~> 1.11"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec", "~> 3.0"
25
- spec.add_development_dependency "rest-client", "~> 2.0"
26
- spec.add_development_dependency "byebug", "~> 2.0"
26
+ spec.add_development_dependency 'bundler', '~> 1.11'
27
+ spec.add_development_dependency 'byebug', '~> 2.0'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rest-client', '~> 2.0'
30
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
31
  end
@@ -1,3 +1,3 @@
1
1
  module Curlyrest
2
- VERSION = "0.1.11"
2
+ VERSION = '0.1.12'.freeze
3
3
  end
data/lib/curlyrest.rb CHANGED
@@ -1,8 +1,10 @@
1
- require "curlyrest/version"
1
+ require 'curlyrest/version'
2
2
  require 'rest-client'
3
3
  require 'byebug'
4
4
 
5
+ # module extending Rest-Client to optionally do via curl
5
6
  module Curlyrest
7
+ # class for a constructing a curl response
6
8
  class CurlResponse
7
9
  include Net::HTTPHeader
8
10
  attr_reader :code, :http_version, :message, :headers
@@ -15,98 +17,145 @@ module Curlyrest
15
17
  @inflate = Zlib::Inflate.new(32 + Zlib::MAX_WBITS)
16
18
  initialize_http_header nil
17
19
  end
18
- def body=(value)
19
- @body = value
20
- end
20
+
21
21
  def unzip_body(gzip)
22
22
  @body = @inflate.inflate(gzip)
23
23
  end
24
24
  end
25
25
 
26
- def parse_response(r)
27
- t = :http_status
28
- n = nil
29
- body = ''
30
- lines = r.lines
31
- i = 0
32
- while (i < lines.length)
33
- case t
34
- when :http_status
35
- rem = /^HTTP\/(\d+\.\d+) (\d+) (.+)$/.match(lines[i])
36
- if rem[2] == '100'
37
- t = :wait_for_another_http
38
- else
39
- t = :headers
40
- n = CurlResponse.new(rem[1], rem[2], rem[3].chop)
41
- end
42
- when :wait_for_another_http
43
- t = :http_status if rem = /^HTTP\/(\d+\.\d+) (\d+) (.+)$/.match(lines[i+1])
44
- when :headers
45
- if /^[\r\n]+$/.match(lines[i])
46
- t = :body
47
- else
48
- rem = /^([\w-]+):\s(.*)/.match(lines[i].chop)
49
- n[rem[1]] = rem[2]
50
- end
51
- when :body
52
- body << lines[i]
26
+ # class for parsing curl responses
27
+ class CurlResponseParser
28
+ attr_accessor :response
29
+ def initialize(response)
30
+ @state = :read_status
31
+ @response = nil
32
+ @body = ''
33
+ parse(response)
34
+ end
35
+
36
+ def parse(response)
37
+ response.lines.each do |line|
38
+ parse_line(line)
39
+ end
40
+ ce = @response.to_hash.dig('content-encoding')
41
+ if ce&.include?('gzip')
42
+ @response.unzip_body(@body)
43
+ else
44
+ @response.body = @body
53
45
  end
54
- i += 1
55
46
  end
56
- if n.to_hash.keys && n.to_hash.keys.include?('content-encoding') &&
57
- n.to_hash['content-encoding'].include?('gzip')
58
- n.unzip_body(body)
59
- else
60
- n.body = (body)
47
+
48
+ def parse_status(line)
49
+ line.chop =~ %r{^HTTP\/(\d+\.\d+) (\d+) (.+)$}
50
+ return if Regexp.last_match(2) == 100
51
+ @state = :headers
52
+ @response = CurlResponse.new(Regexp.last_match(1),
53
+ Regexp.last_match(2),
54
+ Regexp.last_match(3))
61
55
  end
62
- n
63
- end
64
56
 
65
- def curl_data(payload)
66
- payload.to_s if payload
67
- end
57
+ def parse_headers(line)
58
+ if /^\s*$/.match?(line)
59
+ @state = :body
60
+ return
61
+ end
62
+ line.chop =~ /^([\w-]+):\s(.*)/
63
+ @response[Regexp.last_match(1)] =
64
+ Regexp.last_match(2)
65
+ end
68
66
 
69
- def curl_proxy(option)
70
- option ? " -x #{option}" : ''
67
+ def parse_line(line)
68
+ case @state
69
+ when :body
70
+ @body << line
71
+ when :read_status
72
+ parse_status(line)
73
+ when :headers
74
+ parse_headers(line)
75
+ else
76
+ puts "parser error on #{line}"
77
+ end
78
+ end
71
79
  end
72
-
73
- def curl_headers(headers)
74
- ret_headers = ' '
75
- headers.each{|k,v| ret_headers << "-H '#{k}: #{v}' "}
76
- ret_headers
80
+
81
+ # class for transmitting curl requests
82
+ class CurlTransmitter
83
+ attr_accessor :options, :headers, :line
84
+ def initialize(uri, method, headers, payload)
85
+ @payload = payload
86
+ @method = method
87
+ @uri = uri
88
+ @headers, @options = calc_options(headers)
89
+ @line = curl_command
90
+ end
91
+
92
+ def calc_options(headers, options = {})
93
+ options[:curl] = headers.delete('Use-Curl') ||
94
+ headers.delete(:use_curl)
95
+ options[:proxy] = headers.delete('Use-Proxy') ||
96
+ headers.delete(:use_proxy)
97
+ headers.delete('No-Restclient-Headers') ||
98
+ headers.delete(:no_restclient_headers)
99
+ [headers, options]
100
+ end
101
+
102
+ def curl_data(payload)
103
+ payload.&to_s
104
+ end
105
+
106
+ def curl_proxy(option)
107
+ option ? " -x #{option}" : ''
108
+ end
109
+
110
+ def curl_headers(headers)
111
+ ret_headers = ' '
112
+ headers.each { |k, v| ret_headers << "-H '#{k}: #{v}' " }
113
+ ret_headers
114
+ end
115
+
116
+ def curl_command
117
+ @line = "curl -isS -X #{@method.upcase}#{curl_proxy(@options[:proxy])}"\
118
+ "#{curl_headers(@headers)}'#{@uri}' -d '#{curl_data(@payload)}'"
119
+ end
77
120
  end
78
121
 
79
- def transmit(uri, method, headers, payload, &block)
80
- curlyrest_option = headers.delete('Use-Curl') || headers.delete(:use_curl)
81
- proxy_option = headers.delete('Use-Proxy') || headers.delete(:use_proxy)
82
- headers.delete('No-Restclient-Headers') || headers.delete(:no_restclient_headers)
83
- curl_line = "curl -isS -X #{method.upcase}#{curl_proxy(proxy_option)}#{curl_headers(headers)}'#{uri}' -d '#{curl_data(payload)}'"
84
- puts curl_line if curlyrest_option == 'debug'
85
- r = `#{curl_line}`
86
- puts r if curlyrest_option == 'debug'
87
- parse_response(r)
122
+ def transmit(uri, method, headers, payload)
123
+ ct = CurlTransmitter.new(uri, method, headers, payload)
124
+ puts ct.line if ct.options[:curl] == 'debug'
125
+ r = `#{ct.line}`
126
+ puts r if ct.options[:curl] == 'debug'
127
+ CurlResponseParser.new(r).response
88
128
  end
89
129
  end
90
130
 
91
131
  include Curlyrest
92
132
 
133
+ # restclient monkeypatch
93
134
  module RestClient
135
+ # restClient request class
94
136
  class Request
95
- def execute & block
96
- # With 2.0.0+, net/http accepts URI objects in requests and handles wrapping
97
- # IPv6 addresses in [] for use in the Host request header.
98
- case processed_headers['Use-Curl']
99
- when 'debug', 'true'
100
- h = processed_headers['No-Restclient-Headers'] == 'true' ? headers : processed_headers
101
- r = Curlyrest.transmit(uri, method, h, payload, &block)
102
- RestClient::Response.create(r.body, r, self)
137
+ def execute(& block)
138
+ # With 2.0.0+, net/http accepts URI objects in requests and handles
139
+ # wrapping IPv6 addresses in [] for use in the Host request header.
140
+ if processed_headers['Use-Curl']
141
+ curl_execute(& block)
103
142
  else
104
- transmit uri,
105
- net_http_request_class(method).new(uri, processed_headers),
106
- payload, & block
143
+ transmit(uri, net_http_request_class(method)
144
+ .new(uri, processed_headers),
145
+ payload, & block)
107
146
  end
108
147
  ensure
109
- payload.close if payload
148
+ payload&.close
149
+ end
150
+
151
+ def curl_execute(& block)
152
+ h = if processed_headers['No-Restclient-Headers'] == true
153
+ headers
154
+ else
155
+ processed_headers
156
+ end
157
+ r = Curlyrest.transmit(uri, method, h, payload, &block)
158
+ RestClient::Response.create(r.body, r, self)
110
159
  end
111
160
  end
112
161
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curlyrest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Williams
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-18 00:00:00.000000000 Z
11
+ date: 2018-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -25,33 +25,33 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.11'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '2.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: '10.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: '10.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rest-client
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -67,19 +67,19 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: byebug
70
+ name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '2.0'
75
+ version: '3.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '2.0'
82
+ version: '3.0'
83
83
  description: gem extending rest-client, allowing use/debug of curl for request
84
84
  email:
85
85
  - keithrw@comcast.net
@@ -89,6 +89,9 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - ".gitignore"
91
91
  - ".rspec"
92
+ - ".rubocop.yml"
93
+ - ".ruby-gemset"
94
+ - ".ruby-version"
92
95
  - Gemfile
93
96
  - LICENSE.txt
94
97
  - README.md