ruby-proxy-headers 0.2.0 → 0.2.2

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
  SHA256:
3
- metadata.gz: 3a39a089e5181641efdaa2920edfd958bc127311e54be9942fdf5ae563ded24a
4
- data.tar.gz: 0c138a06ea8d8b6dad7ed943b40e67964d05b0daf680e68ac1825a565647596a
3
+ metadata.gz: 30f82103fa860333b7df81d1b90271b048a8dd4e334bcb74caf5c762c2c7d695
4
+ data.tar.gz: 296932a159549772f64c66a305a794800f54a70f08b08f2e6e31cf5270d84c63
5
5
  SHA512:
6
- metadata.gz: 5efd2419ca3cc85309f54823e5a98b59b465cbf98bc32b39503aa9ff11b14732fef71cc6bd5bdb413083b1addeb269bb22b4bdc5093cac29083419823173a234
7
- data.tar.gz: 4fbaf515b270d7544a70bbfab697fe5594820161733290761367f6daee2d225484f3baaea9283420a1230a088a5dd981d7ca9d6a2c7a44f2c5a07e585cb66aa8
6
+ metadata.gz: 92f5f07379e76973c41159aadf9ff343dad72fd7df8ab14a6c090805b7af2c2f52af6ac048916de4a2f65f8e70efc4f11831d721ed16987b9859a14affc069bf
7
+ data.tar.gz: 87c47f3acd8ed3d0741b3075999f632e6998f59cdfb86606de02227fdf3fc9a72c78355964e048c29e8dae02d340d19f18b3b77ea3a131b92ad123e345a41329
data/.yardopts ADDED
@@ -0,0 +1,8 @@
1
+ --readme README.md
2
+ --title ruby-proxy-headers
3
+ --charset utf-8
4
+ --markup markdown
5
+ --no-private
6
+ lib/**/*.rb
7
+ -
8
+ LICENSE
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ [![Gem Version](https://badge.fury.io/rb/ruby-proxy-headers.svg)](https://badge.fury.io/rb/ruby-proxy-headers)
1
2
  # Ruby Proxy Headers
2
3
 
3
4
  Send and receive custom proxy headers during HTTPS `CONNECT` tunneling in modern Ruby HTTP workflows (for example [ProxyMesh](https://proxymesh.com) `X-ProxyMesh-IP` / `X-ProxyMesh-Country`).
@@ -31,6 +31,8 @@ module RubyProxyHeaders
31
31
  # @param target_port [Integer] Target port (default: 443)
32
32
  # @return [OpenSSL::SSL::SSLSocket] TLS-wrapped socket to target
33
33
  def connect(target_host, target_port = 443)
34
+ validate_connect_target!(target_host, target_port)
35
+
34
36
  # Connect to proxy
35
37
  @socket = TCPSocket.new(@proxy[:host], @proxy[:port])
36
38
  @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
@@ -74,6 +76,7 @@ module RubyProxyHeaders
74
76
 
75
77
  # Add custom proxy headers
76
78
  @proxy_headers.each do |name, value|
79
+ RubyProxyHeaders.validate_header!(name, value)
77
80
  request_lines << "#{name}: #{value}"
78
81
  end
79
82
 
@@ -131,6 +134,17 @@ module RubyProxyHeaders
131
134
  @socket = ssl_socket
132
135
  end
133
136
 
137
+ def validate_connect_target!(host, port)
138
+ if RubyProxyHeaders::INVALID_HEADER_VALUE_RE.match?(host.to_s)
139
+ raise ArgumentError,
140
+ "CONNECT target host contains invalid characters (CR, LF, or NUL): #{host.inspect}"
141
+ end
142
+ if RubyProxyHeaders::INVALID_HEADER_VALUE_RE.match?(port.to_s)
143
+ raise ArgumentError,
144
+ "CONNECT target port contains invalid characters (CR, LF, or NUL): #{port.inspect}"
145
+ end
146
+ end
147
+
134
148
  def raise_connect_error
135
149
  case @proxy_response_status
136
150
  when 407
@@ -82,6 +82,7 @@ module RubyProxyHeaders
82
82
  end
83
83
  if proxy_connect_request_headers&.any?
84
84
  proxy_connect_request_headers.each do |k, v|
85
+ RubyProxyHeaders.validate_header!(k, v)
85
86
  buf << "#{k}: #{v}\r\n"
86
87
  end
87
88
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyProxyHeaders
4
- VERSION = '0.2.0'
4
+ VERSION = '0.2.2'
5
5
  end
@@ -4,8 +4,22 @@ require_relative 'ruby_proxy_headers/version'
4
4
  require_relative 'ruby_proxy_headers/net_http'
5
5
 
6
6
  module RubyProxyHeaders
7
+ INVALID_HEADER_NAME_RE = /[\r\n\0]/
8
+ INVALID_HEADER_VALUE_RE = /[\r\n\0]/
9
+
7
10
  # CONNECT response headers from the last Net::HTTP-based proxied HTTPS request on this thread.
8
11
  def self.proxy_connect_response_headers
9
12
  Thread.current[:ruby_proxy_headers_connect_headers]
10
13
  end
14
+
15
+ # Raises ArgumentError if +name+ or +value+ contain CR, LF, or NUL bytes
16
+ # that would allow HTTP header injection in a raw CONNECT request.
17
+ def self.validate_header!(name, value)
18
+ if INVALID_HEADER_NAME_RE.match?(name.to_s)
19
+ raise ArgumentError, "proxy CONNECT header name contains invalid characters (CR, LF, or NUL): #{name.inspect}"
20
+ end
21
+ if INVALID_HEADER_VALUE_RE.match?(value.to_s)
22
+ raise ArgumentError, "proxy CONNECT header value contains invalid characters (CR, LF, or NUL): #{value.inspect}"
23
+ end
24
+ end
11
25
  end
metadata CHANGED
@@ -1,29 +1,84 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-proxy-headers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ProxyMesh
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2026-04-04 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
18
  version: '2.4'
20
19
  type: :development
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - "~>"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
25
  version: '2.4'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '13.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '13.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rspec
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3.12'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.12'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rubocop
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.50'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.50'
68
+ - !ruby/object:Gem::Dependency
69
+ name: yard
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.9'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.9'
27
82
  - !ruby/object:Gem::Dependency
28
83
  name: excon
29
84
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +163,20 @@ dependencies:
108
163
  - - "~>"
109
164
  - !ruby/object:Gem::Version
110
165
  version: '1.6'
166
+ - !ruby/object:Gem::Dependency
167
+ name: webmock
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '3.18'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.18'
111
180
  description: |
112
181
  Extensions for Ruby HTTP stacks to send custom headers on HTTPS CONNECT to a proxy
113
182
  and read headers from the proxy CONNECT response (e.g. X-ProxyMesh-IP).
@@ -116,6 +185,7 @@ executables: []
116
185
  extensions: []
117
186
  extra_rdoc_files: []
118
187
  files:
188
+ - ".yardopts"
119
189
  - DEFERRED.md
120
190
  - IMPLEMENTATION_PRIORITY.md
121
191
  - LIBRARY_RESEARCH.md
@@ -136,7 +206,7 @@ licenses:
136
206
  - MIT
137
207
  metadata:
138
208
  source_code_uri: https://github.com/proxymesh/ruby-proxy-headers
139
- post_install_message:
209
+ documentation_uri: https://rubydoc.info/gems/ruby-proxy-headers
140
210
  rdoc_options: []
141
211
  require_paths:
142
212
  - lib
@@ -151,8 +221,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
221
  - !ruby/object:Gem::Version
152
222
  version: '0'
153
223
  requirements: []
154
- rubygems_version: 3.4.20
155
- signing_key:
224
+ rubygems_version: 4.0.16
156
225
  specification_version: 4
157
226
  summary: Custom proxy CONNECT headers for Ruby HTTP clients (ProxyMesh, etc.)
158
227
  test_files: []