curlyrest 0.1.11 → 0.1.12

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 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