From c11c8ed9a93b5c745cdadf7f6cdaad0196cfbedb Mon Sep 17 00:00:00 2001 From: tigro Date: Thu, 21 Sep 2023 21:36:00 +0300 Subject: [PATCH] import rubygem-faraday-1.0.1-8.el9 --- .rubygem-faraday.metadata | 0 ...0.1-net-http-persistent-3-error-kind.patch | 24 ++ SOURCES/faraday-1.0.1.gem | Bin 0 -> 77312 bytes SOURCES/parser.rb | 246 ++++++++++++++++++ SOURCES/reader.rb | 152 +++++++++++ ...perly-fix-test-failure-with-Rack-2.1.patch | 27 ++ SPECS/rubygem-faraday.spec | 182 +++++++++++++ 7 files changed, 631 insertions(+) create mode 100644 .rubygem-faraday.metadata create mode 100644 SOURCES/faraday-1.0.1-net-http-persistent-3-error-kind.patch create mode 100644 SOURCES/faraday-1.0.1.gem create mode 100644 SOURCES/parser.rb create mode 100644 SOURCES/reader.rb create mode 100644 SOURCES/rubygem-faraday-1.0.1-Properly-fix-test-failure-with-Rack-2.1.patch create mode 100644 SPECS/rubygem-faraday.spec diff --git a/.rubygem-faraday.metadata b/.rubygem-faraday.metadata new file mode 100644 index 0000000..e69de29 diff --git a/SOURCES/faraday-1.0.1-net-http-persistent-3-error-kind.patch b/SOURCES/faraday-1.0.1-net-http-persistent-3-error-kind.patch new file mode 100644 index 0000000..556e96f --- /dev/null +++ b/SOURCES/faraday-1.0.1-net-http-persistent-3-error-kind.patch @@ -0,0 +1,24 @@ +From 687108bb4ddc2511aeaae7449dd401fe62dd5ceb Mon Sep 17 00:00:00 2001 +From: Matt +Date: Thu, 31 Dec 2020 10:51:03 +0000 +Subject: [PATCH] Adds Ruby 3.0 to CI Matrix (#1226) + +--- + .github/workflows/ci.yml | 6 +----- + Gemfile | 2 +- + lib/faraday/adapter/net_http_persistent.rb | 2 +- + 3 files changed, 3 insertions(+), 7 deletions(-) + +diff --git a/lib/faraday/adapter/net_http_persistent.rb b/lib/faraday/adapter/net_http_persistent.rb +index ff20c256..26bcc2ce 100644 +--- a/lib/faraday/adapter/net_http_persistent.rb ++++ b/lib/faraday/adapter/net_http_persistent.rb +@@ -51,7 +51,7 @@ def proxy_uri(env) + + def perform_request(http, env) + http.request env[:url], create_request(env) +- rescue Errno::ETIMEDOUT => e ++ rescue Errno::ETIMEDOUT, Net::OpenTimeout => e + raise Faraday::TimeoutError, e + rescue Net::HTTP::Persistent::Error => e + raise Faraday::TimeoutError, e if e.message.include? 'Timeout' diff --git a/SOURCES/faraday-1.0.1.gem b/SOURCES/faraday-1.0.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..bacc12487cd94fc007171380697ffc6aad8b459b GIT binary patch literal 77312 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 Mz<&_y0AB@9@&Et; literal 0 HcmV?d00001 diff --git a/SOURCES/parser.rb b/SOURCES/parser.rb new file mode 100644 index 0000000..dfb1b05 --- /dev/null +++ b/SOURCES/parser.rb @@ -0,0 +1,246 @@ +module MultipartParser + # A low level parser for multipart messages, + # based on the node-formidable parser. + class Parser + + def initialize + @boundary = nil + @boundary_chars = nil + @lookbehind = nil + @state = :parser_uninitialized + @index = 0 # Index into boundary or header + @flags = {} + @marks = {} # Keep track of different parts + @callbacks = {} + end + + # Initializes the parser, using the given boundary + def init_with_boundary(boundary) + @boundary = "\r\n--" + boundary + @lookbehind = "\0"*(@boundary.length + 8) + @state = :start + + @boundary_chars = {} + @boundary.each_byte do |b| + @boundary_chars[b.chr] = true + end + end + + # Registers a callback to be called when the + # given event occurs. Each callback is expected to + # take three parameters: buffer, start_index, and end_index. + # All of these parameters may be null, depending on the callback. + # Valid callbacks are: + # :end + # :header_field + # :header_value + # :header_end + # :headers_end + # :part_begin + # :part_data + # :part_end + def on(event, &callback) + @callbacks[event] = callback + end + + # Writes data to the parser. + # Returns the number of bytes parsed. + # In practise, this means that if the return value + # is less than the buffer length, a parse error occured. + def write(buffer) + i = 0 + buffer_length = buffer.length + index = @index + flags = @flags.dup + state = @state + lookbehind = @lookbehind + boundary = @boundary + boundary_chars = @boundary_chars + boundary_length = @boundary.length + boundary_end = boundary_length - 1 + + while i < buffer_length + c = buffer[i, 1] + case state + when :parser_uninitialized + return i; + when :start + index = 0; + state = :start_boundary + when :start_boundary # Differs in that it has no preceeding \r\n + if index == boundary_length - 2 + return i unless c == "\r" + index += 1 + elsif index - 1 == boundary_length - 2 + return i unless c == "\n" + # Boundary read successfully, begin next part + callback(:part_begin) + state = :header_field_start + else + return i unless c == boundary[index+2, 1] # Unexpected character + index += 1 + end + i += 1 + when :header_field_start + state = :header_field + @marks[:header_field] = i + index = 0 + when :header_field + if c == "\r" + @marks.delete :header_field + state = :headers_almost_done + else + index += 1 + unless c == "-" # Skip hyphens + if c == ":" + return i if index == 1 # Empty header field + data_callback(:header_field, buffer, i, :clear => true) + state = :header_value_start + else + cl = c.downcase + return i if cl < "a" || cl > "z" + end + end + end + i += 1 + when :header_value_start + if c == " " # Skip spaces + i += 1 + else + @marks[:header_value] = i + state = :header_value + end + when :header_value + if c == "\r" + data_callback(:header_value, buffer, i, :clear => true) + callback(:header_end) + state = :header_value_almost_done + end + i += 1 + when :header_value_almost_done + return i unless c == "\n" + state = :header_field_start + i += 1 + when :headers_almost_done + return i unless c == "\n" + callback(:headers_end) + state = :part_data_start + i += 1 + when :part_data_start + state = :part_data + @marks[:part_data] = i + when :part_data + prev_index = index + + if index == 0 + # Boyer-Moore derived algorithm to safely skip non-boundary data + # See http://debuggable.com/posts/parsing-file-uploads-at-500- + # mb-s-with-node-js:4c03862e-351c-4faa-bb67-4365cbdd56cb + while i + boundary_length <= buffer_length + break if boundary_chars.has_key? buffer[i + boundary_end].chr + i += boundary_length + end + c = buffer[i, 1] + end + + if index < boundary_length + if boundary[index, 1] == c + if index == 0 + data_callback(:part_data, buffer, i, :clear => true) + end + index += 1 + else # It was not the boundary we found, after all + index = 0 + end + elsif index == boundary_length + index += 1 + if c == "\r" + flags[:part_boundary] = true + elsif c == "-" + flags[:last_boundary] = true + else # We did not find a boundary after all + index = 0 + end + elsif index - 1 == boundary_length + if flags[:part_boundary] + index = 0 + if c == "\n" + flags.delete :part_boundary + callback(:part_end) + callback(:part_begin) + state = :header_field_start + i += 1 + next # Ugly way to break out of the case statement + end + elsif flags[:last_boundary] + if c == "-" + callback(:part_end) + callback(:end) + state = :end + else + index = 0 # False alarm + end + else + index = 0 + end + end + + if index > 0 + # When matching a possible boundary, keep a lookbehind + # reference in case it turns out to be a false lead + lookbehind[index-1] = c + elsif prev_index > 0 + # If our boundary turns out to be rubbish, + # the captured lookbehind belongs to part_data + callback(:part_data, lookbehind, 0, prev_index) + @marks[:part_data] = i + + # Reconsider the current character as it might be the + # beginning of a new sequence. + i -= 1 + end + + i += 1 + when :end + i += 1 + else + return i; + end + end + + data_callback(:header_field, buffer, buffer_length) + data_callback(:header_value, buffer, buffer_length) + data_callback(:part_data, buffer, buffer_length) + + @index = index + @state = state + @flags = flags + + return buffer_length + end + + private + + # Issues a callback. + def callback(event, buffer = nil, start = nil, the_end = nil) + return if !start.nil? && start == the_end + if @callbacks.has_key? event + @callbacks[event].call(buffer, start, the_end) + end + end + + # Issues a data callback, + # The only valid options is :clear, + # which, if true, will reset the appropriate mark to 0, + # If not specified, the mark will be removed. + def data_callback(data_type, buffer, the_end, options = {}) + return unless @marks.has_key? data_type + callback(data_type, buffer, @marks[data_type], the_end) + unless options[:clear] + @marks[data_type] = 0 + else + @marks.delete data_type + end + end + end +end diff --git a/SOURCES/reader.rb b/SOURCES/reader.rb new file mode 100644 index 0000000..d63562c --- /dev/null +++ b/SOURCES/reader.rb @@ -0,0 +1,152 @@ +require 'multipart_parser/parser' + +module MultipartParser + class NotMultipartError < StandardError; end; + + # A more high level interface to MultipartParser. + class Reader + + # Initializes a MultipartReader, that will + # read a request with the given boundary value. + def initialize(boundary) + @parser = Parser.new + @parser.init_with_boundary(boundary) + @header_field = '' + @header_value = '' + @part = nil + @ended = false + @on_error = nil + @on_part = nil + + init_parser_callbacks + end + + # Returns true if the parser has finished parsing + def ended? + @ended + end + + # Sets to a code block to call + # when part headers have been parsed. + def on_part(&callback) + @on_part = callback + end + + # Sets a code block to call when + # a parser error occurs. + def on_error(&callback) + @on_error = callback + end + + # Write data from the given buffer (String) + # into the reader. + def write(buffer) + bytes_parsed = @parser.write(buffer) + if bytes_parsed != buffer.size + msg = "Parser error, #{bytes_parsed} of #{buffer.length} bytes parsed" + @on_error.call(msg) unless @on_error.nil? + end + end + + # Extracts a boundary value from a Content-Type header. + # Note that it is the header value you provide here. + # Raises NotMultipartError if content_type is invalid. + def self.extract_boundary_value(content_type) + if content_type =~ /multipart/i + if match = (content_type =~ /boundary=(?:"([^"]+)"|([^;]+))/i) + $1 || $2 + else + raise NotMultipartError.new("No multipart boundary") + end + else + raise NotMultipartError.new("Not a multipart content type!") + end + end + + class Part + attr_accessor :filename, :headers, :name, :mime + + def initialize + @headers = {} + @data_callback = nil + @end_callback = nil + end + + # Calls the data callback with the given data + def emit_data(data) + @data_callback.call(data) unless @data_callback.nil? + end + + # Calls the end callback + def emit_end + @end_callback.call unless @end_callback.nil? + end + + # Sets a block to be called when part data + # is read. The block should take one parameter, + # namely the read data. + def on_data(&callback) + @data_callback = callback + end + + # Sets a block to be called when all data + # for the part has been read. + def on_end(&callback) + @end_callback = callback + end + end + + private + + def init_parser_callbacks + @parser.on(:part_begin) do + @part = Part.new + @header_field = '' + @header_value = '' + end + + @parser.on(:header_field) do |b, start, the_end| + @header_field << b[start...the_end] + end + + @parser.on(:header_value) do |b, start, the_end| + @header_value << b[start...the_end] + end + + @parser.on(:header_end) do + @header_field.downcase! + @part.headers[@header_field] = @header_value + if @header_field == 'content-disposition' + if @header_value =~ /name="([^"]+)"/i + @part.name = $1 + end + if @header_value =~ /filename="([^;]+)"/i + match = $1 + start = (match.rindex("\\") || -1)+1 + @part.filename = match[start...(match.length)] + end + elsif @header_field == 'content-type' + @part.mime = @header_value + end + @header_field = '' + @header_value = '' + end + + @parser.on(:headers_end) do + @on_part.call(@part) unless @on_part.nil? + end + + @parser.on(:part_data) do |b, start, the_end| + @part.emit_data b[start...the_end] + end + + @parser.on(:part_end) do + @part.emit_end + end + + @parser.on(:end) do + @ended = true + end + end + end +end diff --git a/SOURCES/rubygem-faraday-1.0.1-Properly-fix-test-failure-with-Rack-2.1.patch b/SOURCES/rubygem-faraday-1.0.1-Properly-fix-test-failure-with-Rack-2.1.patch new file mode 100644 index 0000000..8816a50 --- /dev/null +++ b/SOURCES/rubygem-faraday-1.0.1-Properly-fix-test-failure-with-Rack-2.1.patch @@ -0,0 +1,27 @@ +From bf03db0979954ef4dd8646c53b73a003af70a953 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?V=C3=ADt=20Ondruch?= +Date: Fri, 24 Jul 2020 20:39:25 +0200 +Subject: [PATCH] Properly fix test failure with Rack 2.1+. + +Rack is not to blame, just naive test case which was enough so far. + +Fixes #1119 +--- + spec/support/shared_examples/request_method.rb | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/spec/support/shared_examples/request_method.rb b/spec/support/shared_examples/request_method.rb +index 8e2828a2..917e48ca 100644 +--- a/spec/support/shared_examples/request_method.rb ++++ b/spec/support/shared_examples/request_method.rb +@@ -13,8 +13,8 @@ + end + + it 'handles headers with multiple values' do +- request_stub.to_return(headers: { 'Set-Cookie' => 'one, two' }) +- expect(response.headers['set-cookie']).to eq('one, two') ++ request_stub.to_return(headers: { 'Set-Cookie' => 'name=value' }) ++ expect(response.headers['set-cookie']).to eq('name=value') + end + + it 'retrieves the response headers' do diff --git a/SPECS/rubygem-faraday.spec b/SPECS/rubygem-faraday.spec new file mode 100644 index 0000000..05020ff --- /dev/null +++ b/SPECS/rubygem-faraday.spec @@ -0,0 +1,182 @@ +# Generated from faraday-0.8.7.gem by gem2rpm -*- rpm-spec -*- +%global gem_name faraday + +Name: rubygem-%{gem_name} +Version: 1.0.1 +Release: 8%{?dist} +Summary: HTTP/REST API client library +License: MIT +URL: https://lostisland.github.io/faraday +Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem +# Since we don't have multipart-parser in Fedora, include the essential part +# just for testing purposes. +# https://github.com/danabr/multipart-parser/blob/master/lib/multipart_parser/parser.rb +Source1: https://raw.githubusercontent.com/danabr/multipart-parser/master/lib/multipart_parser/parser.rb +# https://github.com/danabr/multipart-parser/blob/master/lib/multipart_parser/reader.rb +Source2: https://raw.githubusercontent.com/danabr/multipart-parser/master/lib/multipart_parser/reader.rb +# Fix Rack 2.1+ test compatibility. +# https://github.com/lostisland/faraday/pull/1171 +Patch0: rubygem-faraday-1.0.1-Properly-fix-test-failure-with-Rack-2.1.patch +# Extracted from: +# https://github.com/lostisland/faraday/commit/687108bb4ddc2511aeaae7449dd401fe62dd5ceb +Patch1: faraday-1.0.1-net-http-persistent-3-error-kind.patch +BuildRequires: ruby(release) +BuildRequires: rubygems-devel +BuildRequires: ruby >= 2.3 +BuildRequires: rubygem(multipart-post) +BuildRequires: rubygem(rack) +BuildRequires: rubygem(rspec) +BuildRequires: rubygem(webmock) +# Adapter test dependencies, might be optionally disabled. +BuildRequires: rubygem(em-http-request) +BuildRequires: rubygem(excon) +BuildRequires: rubygem(httpclient) +BuildRequires: rubygem(net-http-persistent) +BuildRequires: rubygem(rack-test) +BuildRequires: rubygem(typhoeus) +BuildArch: noarch + +%description +HTTP/REST API client library. + + +%package doc +Summary: Documentation for %{name} +Requires: %{name} = %{version}-%{release} +BuildArch: noarch + +%description doc +Documentation for %{name}. + +%prep +mkdir -p multipart_parser/multipart_parser +cp %{SOURCE1} %{SOURCE2} multipart_parser/multipart_parser + +%autosetup -n %{gem_name}-%{version} -p1 + +%build +# Create the gem as gem install only works on a gem file +gem build ../%{gem_name}-%{version}.gemspec + +# %%gem_install compiles any C extensions and installs the gem into ./%%gem_dir +# by default, so that we can move it into the buildroot in %%install +%gem_install + +%install +mkdir -p %{buildroot}%{gem_dir} +cp -a .%{gem_dir}/* \ + %{buildroot}%{gem_dir}/ + + + +%check +pushd .%{gem_instdir} +# We don't care about code coverage. +sed -i "/simplecov/ s/^/#/" spec/spec_helper.rb +sed -i "/coveralls/ s/^/#/" spec/spec_helper.rb +sed -i "/SimpleCov/,/^end$/ s/^/#/" spec/spec_helper.rb + +# We don't need Pry. +sed -i "/pry/ s/^/#/" spec/spec_helper.rb + +# We don't have {patron,em-synchrony} available in Fedora. +mv spec/faraday/adapter/em_synchrony_spec.rb{,.disabled} +mv spec/faraday/adapter/patron_spec.rb{,.disabled} + +# This needs http-net-persistent 3.0+. +sed -i '/allows to set min_version in SSL settings/a\ skip' \ + spec/faraday/adapter/net_http_persistent_spec.rb + +rspec -I%{_builddir}/multipart_parser -rspec_helper -r%{SOURCE1} spec -f d +popd + +%files +%dir %{gem_instdir} +%license %{gem_instdir}/LICENSE.md +%{gem_libdir} +%exclude %{gem_cache} +%{gem_spec} + +%files doc +%doc %{gem_docdir} +%doc %{gem_instdir}/CHANGELOG.md +%doc %{gem_instdir}/README.md +%{gem_instdir}/Rakefile +%{gem_instdir}/examples +%{gem_instdir}/spec + +%changelog +* Thu Sep 21 2023 Arkady L. Shane - 1.0.1-8 +- Rebuilt for MSVSphere 9.2 + +* Fri Jan 20 2023 Fedora Release Engineering - 1.0.1-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Sat Jul 23 2022 Fedora Release Engineering - 1.0.1-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Fri Jan 21 2022 Fedora Release Engineering - 1.0.1-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Fri Jul 23 2021 Fedora Release Engineering - 1.0.1-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Sat Feb 20 2021 Mamoru TASAKA - 1.0.1-4 +- Use upstream patch for net-http-persistent 4.0 + +* Sat Feb 20 2021 Mamoru TASAKA - 1.0.1-3 +- Support for net-http-persistent 4.0 net connection failure error change + +* Wed Jan 27 2021 Fedora Release Engineering - 1.0.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Thu Jul 23 2020 Vít Ondruch - 1.0.1-1 +- Update to Faraday 1.0.1. + Resolves: rhbz#1756449 + +* Thu Jan 30 2020 Fedora Release Engineering - 0.15.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Fri Jul 26 2019 Fedora Release Engineering - 0.15.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Fri Mar 01 2019 Vít Ondruch - 0.15.4-1 +- Update to Faraday 0.15.4. + +* Sat Feb 02 2019 Fedora Release Engineering - 0.9.0-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Sat Jul 14 2018 Fedora Release Engineering - 0.9.0-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Fri Feb 09 2018 Fedora Release Engineering - 0.9.0-6 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 0.9.0-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Sat Feb 11 2017 Fedora Release Engineering - 0.9.0-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Thu Feb 04 2016 Fedora Release Engineering - 0.9.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Jun 18 2015 Fedora Release Engineering - 0.9.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Tue Jun 17 2014 Achilleas Pipinellis - 0.9.0-1 +- Bump to 0.9.0 +- Remove unessecary files + +* Sun Jun 08 2014 Fedora Release Engineering - 0.8.8-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Sun Nov 17 2013 Achilleas Pipinellis - 0.8.8-2 +- Remove multibytes.txt +- Remove Gemfile, Rakefile from doc macro + +* Sun Aug 04 2013 Anuj More - 0.8.8-1 +- From 0.8.7 to 0.8.8 + +* Tue May 14 2013 Anuj More - 0.8.7-1 +- Initial package