bunny 2.6.4 → 2.6.5
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 +4 -4
- data/.gitignore +2 -0
- data/CONTRIBUTING.md +24 -11
- data/ChangeLog.md +23 -1
- data/README.md +3 -5
- data/Rakefile +10 -2
- data/bunny.gemspec +1 -1
- data/docker-compose.yml +18 -0
- data/docker/Dockerfile +3 -1
- data/docker/docker-entrypoint.sh +2 -5
- data/lib/bunny/channel.rb +5 -5
- data/lib/bunny/reader_loop.rb +1 -1
- data/lib/bunny/session.rb +4 -3
- data/lib/bunny/transport.rb +13 -8
- data/lib/bunny/version.rb +1 -1
- data/spec/config/rabbitmq.config +6 -5
- data/spec/higher_level_api/integration/connection_recovery_spec.rb +18 -6
- data/spec/higher_level_api/integration/connection_stop_spec.rb +12 -1
- data/spec/higher_level_api/integration/exchange_declare_spec.rb +6 -5
- data/spec/higher_level_api/integration/tls_connection_spec.rb +62 -4
- data/spec/stress/concurrent_consumers_stress_spec.rb +2 -2
- data/spec/tls/generate-server-cert.sh +8 -0
- data/spec/tls/server-openssl.cnf +10 -0
- data/spec/tls/server.csr +16 -0
- metadata +12 -6
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9646b786d482eb19ff72a0cca49d19b35133a3ee
         | 
| 4 | 
            +
              data.tar.gz: 9eaee52c70d70e93ed1ccbc532305ddd67d028ef
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 907064ff90c3752d8e2a240d3a86558e6462984ed10a24c0b51eaded877fa2373cf6b278376fc34205b85742a0769d9838c906cf1fb6916debad58177dcd4db4
         | 
| 7 | 
            +
              data.tar.gz: cab82513ced1682e9282c4595a79d531989954972c3a2f9179625c46d857251c8b50d7137501ae129eb6b58bd37f80e716989d7fd0be6e00dc291b9b9213401c
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/CONTRIBUTING.md
    CHANGED
    
    | @@ -24,7 +24,14 @@ Run the following command from the base directory of the gem: | |
| 24 24 | 
             
            RABBITMQ_NODENAME=bunny RABBITMQ_CONFIG_FILE=./spec/config/rabbitmq RABBITMQ_ENABLED_PLUGINS_FILE=./spec/config/enabled_plugins rabbitmq-server
         | 
| 25 25 | 
             
            ```
         | 
| 26 26 |  | 
| 27 | 
            -
            The specs use the RabbitMQ management plugin and require a TLS port to | 
| 27 | 
            +
            The specs use the RabbitMQ management plugin and require a TLS port to
         | 
| 28 | 
            +
            be available. The config files in the spec/config directory enable
         | 
| 29 | 
            +
            these. TLS (x509 PEM) certificates include a hostname-specific fields,
         | 
| 30 | 
            +
            the tests allow for expecting hostname overriding using the `BUNNY_RABBITMQ_HOSTNAME`
         | 
| 31 | 
            +
            environment variables (default value is `127.0.0.1`).
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            Server, CA and client certificates can be found under `spec/tls`. They are supposed to be
         | 
| 34 | 
            +
            generated with [tls-gen](github.com/michaelklishin/tls-gen) or similar in the target environment.
         | 
| 28 35 |  | 
| 29 36 | 
             
            Next up you'll need to prepare your node for the specs (just once):
         | 
| 30 37 |  | 
| @@ -32,6 +39,12 @@ Next up you'll need to prepare your node for the specs (just once): | |
| 32 39 | 
             
            RABBITMQ_NODENAME=bunny ./bin/ci/before_build
         | 
| 33 40 | 
             
            ```
         | 
| 34 41 |  | 
| 42 | 
            +
            The script uses `rabbitmqctl` and `rabbitmq-plugins`
         | 
| 43 | 
            +
            to set up RabbitMQ in a way that Bunny test suites expect. Two environment variables,
         | 
| 44 | 
            +
            `RABBITMQCTL` and `RABBITMQ_PLUGINS`, are available to control what `rabbitmqctl` and
         | 
| 45 | 
            +
            `rabbitmq-plugins` commands will be used. By default they are taken from `PATH`
         | 
| 46 | 
            +
            and prefixed with `sudo`.
         | 
| 47 | 
            +
             | 
| 35 48 | 
             
            And then run the core integration suite:
         | 
| 36 49 |  | 
| 37 50 | 
             
            ```
         | 
| @@ -40,26 +53,26 @@ RABBITMQ_NODENAME=bunny CI=true rspec | |
| 40 53 |  | 
| 41 54 | 
             
            #### Running a RabbitMQ server in a Docker container
         | 
| 42 55 |  | 
| 43 | 
            -
            First off you have to [install Docker](https:// | 
| 56 | 
            +
            First off you have to [install Docker Compose](https://docker.github.io/compose/install/) (and by proxy Docker).
         | 
| 57 | 
            +
            Version >= 1.6.0+ is required for compose version 2 syntax.
         | 
| 44 58 |  | 
| 45 | 
            -
            After  | 
| 59 | 
            +
            After those have been installed (and the `docker-compose` command is available on your command line path), run
         | 
| 46 60 |  | 
| 47 | 
            -
             | 
| 61 | 
            +
            ```
         | 
| 62 | 
            +
            docker-compose up
         | 
| 63 | 
            +
            ```
         | 
| 48 64 |  | 
| 49 65 | 
             
            The first time you do this, it will take some time, since it has to download everything it needs
         | 
| 50 66 | 
             
            to build the Docker image.
         | 
| 51 67 |  | 
| 52 68 | 
             
            The RabbitMQ server will run in the foreground in the terminal where you started it. You can stop
         | 
| 53 | 
            -
            it by pressing CTRL+C.
         | 
| 69 | 
            +
            it by pressing CTRL+C. If you want to run it in the background, run `docker-compose up -d`.
         | 
| 54 70 |  | 
| 55 71 | 
             
            ### Running Test Suites
         | 
| 56 72 |  | 
| 57 | 
            -
            Prior to running the tests, configure the RabbitMQ permissions
         | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
            `RABBITMQCTL` and `RABBITMQ_PLUGINS`, are available to control what `rabbitmqctl` and
         | 
| 61 | 
            -
            `rabbitmq-plugins` commands will be used. By default they are taken from `PATH`
         | 
| 62 | 
            -
            and prefixed with `sudo`.
         | 
| 73 | 
            +
            Prior to running the tests, configure the RabbitMQ permissions by running `./bin/ci/before_build` 
         | 
| 74 | 
            +
            if you have RabbitMQ locally installed, if you are running RabbitMQ via Docker as above this step 
         | 
| 75 | 
            +
            is not required as the setup is baked in.
         | 
| 63 76 |  | 
| 64 77 | 
             
            Make sure you have those two installed and then run integration tests:
         | 
| 65 78 |  | 
    
        data/ChangeLog.md
    CHANGED
    
    | @@ -1,4 +1,20 @@ | |
| 1 | 
            -
            ## Changes between Bunny 2.6. | 
| 1 | 
            +
            ## Changes between Bunny 2.6.4 and 2.6.5 (April 15th, 2017)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ### Absolute Windows File Paths are No Longer treated as Inline Certs
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Contributed by Jared Smartt.
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            GitHub issue: [#492](https://github.com/ruby-amqp/bunny/issues/492).
         | 
| 8 | 
            +
             | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
            ## Changes between Bunny 2.6.3 and 2.6.4 (March 4th, 2017)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ### `Bunny::ContinuationQueue#poll` Less Prone to Race Conditions
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            `Bunny::ContinuationQueue#poll` was reworked with feedback from Joseph Wong.
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            GitHub issue: [#462](https://github.com/ruby-amqp/bunny/issues/462)
         | 
| 2 18 |  | 
| 3 19 | 
             
            ### Recovery Attempt Counting Strategy Changed
         | 
| 4 20 |  | 
| @@ -16,6 +32,12 @@ a hell of a lot more logging. | |
| 16 32 |  | 
| 17 33 | 
             
            GitHub issue: [#408](https://github.com/ruby-amqp/bunny/issues/408)
         | 
| 18 34 |  | 
| 35 | 
            +
            ### Opening a Channel on an Intentionally Closed Connection Immediately Raises an Exception
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            Contributed by Alessandro Verlato.
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            GitHub issue: [#465](https://github.com/ruby-amqp/bunny/issues/465)
         | 
| 40 | 
            +
             | 
| 19 41 |  | 
| 20 42 | 
             
            ## Changes between Bunny 2.6.2 and 2.6.3 (January 19th, 2016)
         | 
| 21 43 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -73,7 +73,7 @@ a stable public API. | |
| 73 73 |  | 
| 74 74 | 
             
            ### Most Recent Release
         | 
| 75 75 |  | 
| 76 | 
            -
            [](http://badge.fury.io/rb/bunny)
         | 
| 77 77 |  | 
| 78 78 | 
             
            ### With Rubygems
         | 
| 79 79 |  | 
| @@ -88,7 +88,7 @@ gem install bunny | |
| 88 88 | 
             
            To use Bunny in a project managed with Bundler:
         | 
| 89 89 |  | 
| 90 90 | 
             
            ``` ruby
         | 
| 91 | 
            -
            gem "bunny", ">= 2.6. | 
| 91 | 
            +
            gem "bunny", ">= 2.6.4"
         | 
| 92 92 | 
             
            ```
         | 
| 93 93 |  | 
| 94 94 |  | 
| @@ -167,9 +167,7 @@ to also join the [RabbitMQ mailing list](https://groups.google.com/forum/#!forum | |
| 167 167 |  | 
| 168 168 | 
             
            To subscribe for announcements of releases, important changes and so on, please follow [@rubyamqp](https://twitter.com/#!/rubyamqp) on Twitter.
         | 
| 169 169 |  | 
| 170 | 
            -
            More detailed announcements can be found in the  | 
| 171 | 
            -
             | 
| 172 | 
            -
            * [RabbitMQ Ruby clients blog](http://blog.rubyrabbitmq.info)
         | 
| 170 | 
            +
            More detailed announcements can be found in the [RabbitMQ Ruby clients blog](http://blog.rubyrabbitmq.info).
         | 
| 173 171 |  | 
| 174 172 |  | 
| 175 173 | 
             
            ### Reporting Issues
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -4,7 +4,7 @@ require 'rspec/core/rake_task' | |
| 4 4 | 
             
            RSpec::Core::RakeTask.new(:integration) do |t|
         | 
| 5 5 | 
             
              # excludes unit tests as those involve many iterations
         | 
| 6 6 | 
             
              # and sometimes suffer from obscure interference from integration tests (!)
         | 
| 7 | 
            -
              t.pattern    = ["spec/higher_level_api/integration", "spec/lower_level_api/integration", "spec/issues" | 
| 7 | 
            +
              t.pattern    = ["spec/higher_level_api/integration", "spec/lower_level_api/integration", "spec/issues"].
         | 
| 8 8 | 
             
                map { |dir| Dir.glob(File.join(dir, "**", "*_spec.rb")) }.reduce(&:+) - ["spec/higher_level_api/integration/tls_connection_spec.rb"]
         | 
| 9 9 |  | 
| 10 10 | 
             
              t.rspec_opts = "--format progress"
         | 
| @@ -30,9 +30,17 @@ end | |
| 30 30 | 
             
            RSpec::Core::RakeTask.new(:recovery_integration) do |t|
         | 
| 31 31 | 
             
              # otherwise all examples will be skipped
         | 
| 32 32 | 
             
              ENV.delete("CI")
         | 
| 33 | 
            -
              t.pattern    =  | 
| 33 | 
            +
              t.pattern    = ["spec/higher_level_api/integration/connection_recovery_spec.rb"]
         | 
| 34 34 |  | 
| 35 35 | 
             
              t.rspec_opts = "--format progress --backtrace"
         | 
| 36 36 | 
             
            end
         | 
| 37 37 |  | 
| 38 | 
            +
            RSpec::Core::RakeTask.new(:stress) do |t|
         | 
| 39 | 
            +
              # excludes unit tests as those involve many iterations
         | 
| 40 | 
            +
              # and sometimes suffer from obscure interference from integration tests (!)
         | 
| 41 | 
            +
              t.pattern    = ["spec/stress/**/*_spec.rb"]
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              t.rspec_opts = "--format progress"
         | 
| 44 | 
            +
            end
         | 
| 45 | 
            +
             | 
| 38 46 | 
             
            task :default => :integration
         | 
    
        data/bunny.gemspec
    CHANGED
    
    
    
        data/docker-compose.yml
    ADDED
    
    | @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            version: '2'
         | 
| 2 | 
            +
            services:
         | 
| 3 | 
            +
              rabbitmq:
         | 
| 4 | 
            +
                build: ./docker
         | 
| 5 | 
            +
                container_name: bunny_rabbitmq
         | 
| 6 | 
            +
                environment:
         | 
| 7 | 
            +
                  RABBITMQ_NODENAME: bunny
         | 
| 8 | 
            +
                  # link to spec specific configuration
         | 
| 9 | 
            +
                  RABBITMQ_CONFIG_FILE: /spec/config/rabbitmq
         | 
| 10 | 
            +
                  RABBITMQ_ENABLED_PLUGINS_FILE: /spec/config/enabled_plugins
         | 
| 11 | 
            +
                  # send logs to stdout
         | 
| 12 | 
            +
                  RABBITMQ_LOGS: '-'
         | 
| 13 | 
            +
                  RABBITMQ_SASL_LOGS: '-'
         | 
| 14 | 
            +
                ports:
         | 
| 15 | 
            +
                  - 5671-5672:5671-5672
         | 
| 16 | 
            +
                  - 15672:15672
         | 
| 17 | 
            +
                volumes:
         | 
| 18 | 
            +
                  - ./spec:/spec:ro
         | 
    
        data/docker/Dockerfile
    CHANGED
    
    | @@ -4,7 +4,7 @@ RUN apt-get -q update && \ | |
| 4 4 | 
             
                apt-get install -yq --no-install-recommends wget ca-certificates
         | 
| 5 5 |  | 
| 6 6 | 
             
            RUN echo 'deb http://www.rabbitmq.com/debian/ testing main' > /etc/apt/sources.list.d/rabbitmq.list && \
         | 
| 7 | 
            -
                wget -O- https://www.rabbitmq.com/rabbitmq-signing-key | 
| 7 | 
            +
                wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | apt-key add -
         | 
| 8 8 |  | 
| 9 9 | 
             
            RUN apt-get -q update && \
         | 
| 10 10 | 
             
                apt-get install -yq --no-install-recommends rabbitmq-server
         | 
| @@ -12,3 +12,5 @@ RUN apt-get -q update && \ | |
| 12 12 | 
             
            COPY docker-entrypoint.sh /
         | 
| 13 13 |  | 
| 14 14 | 
             
            ENTRYPOINT /docker-entrypoint.sh
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            EXPOSE 5671 5672 15672
         | 
    
        data/docker/docker-entrypoint.sh
    CHANGED
    
    | @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            #!/bin/sh
         | 
| 2 2 | 
             
            server=rabbitmq-server
         | 
| 3 3 | 
             
            ctl=rabbitmqctl
         | 
| 4 | 
            -
            plugins=rabbitmq-plugins
         | 
| 5 4 | 
             
            delay=3
         | 
| 6 5 |  | 
| 6 | 
            +
            echo "[Configuration] $(eval cat $RABBITMQ_CONFIG_FILE.config)"
         | 
| 7 | 
            +
             | 
| 7 8 | 
             
            echo '[Configuration] Starting RabbitMQ in detached mode.'
         | 
| 8 9 |  | 
| 9 10 | 
             
            $server -detached
         | 
| @@ -12,10 +13,6 @@ echo "[Configuration] Waiting $delay seconds for RabbitMQ to start." | |
| 12 13 |  | 
| 13 14 | 
             
            sleep $delay
         | 
| 14 15 |  | 
| 15 | 
            -
            echo '*** Enabling plugins ***'
         | 
| 16 | 
            -
            $plugins enable --online rabbitmq_management
         | 
| 17 | 
            -
            $plugins enable --online rabbitmq_consistent_hash_exchange
         | 
| 18 | 
            -
             | 
| 19 16 | 
             
            echo '*** Creating users ***'
         | 
| 20 17 | 
             
            $ctl add_user bunny_gem bunny_password
         | 
| 21 18 | 
             
            $ctl add_user bunny_reader reader_password
         | 
    
        data/lib/bunny/channel.rb
    CHANGED
    
    | @@ -308,7 +308,7 @@ module Bunny | |
| 308 308 | 
             
                # @see http://rubybunny.info/articles/extensions.html RabbitMQ Extensions to AMQP 0.9.1 guide
         | 
| 309 309 | 
             
                # @api public
         | 
| 310 310 | 
             
                def fanout(name, opts = {})
         | 
| 311 | 
            -
                  Exchange.new(self, :fanout, name, opts)
         | 
| 311 | 
            +
                  find_exchange(name) || Exchange.new(self, :fanout, name, opts)
         | 
| 312 312 | 
             
                end
         | 
| 313 313 |  | 
| 314 314 | 
             
                # Declares a direct exchange or looks it up in the cache of previously
         | 
| @@ -326,7 +326,7 @@ module Bunny | |
| 326 326 | 
             
                # @see http://rubybunny.info/articles/extensions.html RabbitMQ Extensions to AMQP 0.9.1 guide
         | 
| 327 327 | 
             
                # @api public
         | 
| 328 328 | 
             
                def direct(name, opts = {})
         | 
| 329 | 
            -
                  Exchange.new(self, :direct, name, opts)
         | 
| 329 | 
            +
                  find_exchange(name) || Exchange.new(self, :direct, name, opts)
         | 
| 330 330 | 
             
                end
         | 
| 331 331 |  | 
| 332 332 | 
             
                # Declares a topic exchange or looks it up in the cache of previously
         | 
| @@ -344,7 +344,7 @@ module Bunny | |
| 344 344 | 
             
                # @see http://rubybunny.info/articles/extensions.html RabbitMQ Extensions to AMQP 0.9.1 guide
         | 
| 345 345 | 
             
                # @api public
         | 
| 346 346 | 
             
                def topic(name, opts = {})
         | 
| 347 | 
            -
                  Exchange.new(self, :topic, name, opts)
         | 
| 347 | 
            +
                  find_exchange(name) || Exchange.new(self, :topic, name, opts)
         | 
| 348 348 | 
             
                end
         | 
| 349 349 |  | 
| 350 350 | 
             
                # Declares a headers exchange or looks it up in the cache of previously
         | 
| @@ -362,7 +362,7 @@ module Bunny | |
| 362 362 | 
             
                # @see http://rubybunny.info/articles/extensions.html RabbitMQ Extensions to AMQP 0.9.1 guide
         | 
| 363 363 | 
             
                # @api public
         | 
| 364 364 | 
             
                def headers(name, opts = {})
         | 
| 365 | 
            -
                  Exchange.new(self, :headers, name, opts)
         | 
| 365 | 
            +
                  find_exchange(name) || Exchange.new(self, :headers, name, opts)
         | 
| 366 366 | 
             
                end
         | 
| 367 367 |  | 
| 368 368 | 
             
                # Provides access to the default exchange
         | 
| @@ -1384,7 +1384,7 @@ module Bunny | |
| 1384 1384 | 
             
                # @see #nacked_set
         | 
| 1385 1385 | 
             
                # @see http://rubybunny.info/articles/extensions.html RabbitMQ Extensions guide
         | 
| 1386 1386 | 
             
                # @api public
         | 
| 1387 | 
            -
                def confirm_select(callback=nil)
         | 
| 1387 | 
            +
                def confirm_select(callback = nil)
         | 
| 1388 1388 | 
             
                  raise_if_no_longer_open!
         | 
| 1389 1389 |  | 
| 1390 1390 | 
             
                  if @next_publish_seq_no == 0
         | 
    
        data/lib/bunny/reader_loop.rb
    CHANGED
    
    | @@ -54,7 +54,7 @@ module Bunny | |
| 54 54 | 
             
                        @network_is_down = true
         | 
| 55 55 | 
             
                        @session_thread.raise(Bunny::NetworkFailure.new("caught an unexpected exception in the network loop: #{e.message}", e))
         | 
| 56 56 | 
             
                      end
         | 
| 57 | 
            -
                    rescue Errno::EBADF =>  | 
| 57 | 
            +
                    rescue Errno::EBADF => _ebadf
         | 
| 58 58 | 
             
                      break if terminate?
         | 
| 59 59 | 
             
                      # ignored, happens when we loop after the transport has already been closed
         | 
| 60 60 | 
             
                      @mutex.synchronize { @stopping = true }
         | 
    
        data/lib/bunny/session.rb
    CHANGED
    
    | @@ -187,7 +187,8 @@ module Bunny | |
| 187 187 | 
             
                  @channel_max        = @client_channel_max
         | 
| 188 188 | 
             
                  @client_heartbeat   = self.heartbeat_from(opts)
         | 
| 189 189 |  | 
| 190 | 
            -
                   | 
| 190 | 
            +
                  client_props         = opts[:properties] || opts[:client_properties] || {}
         | 
| 191 | 
            +
                  @client_properties   = DEFAULT_CLIENT_PROPERTIES.merge(client_props)
         | 
| 191 192 | 
             
                  @mechanism           = opts.fetch(:auth_mechanism, "PLAIN")
         | 
| 192 193 | 
             
                  @credentials_encoder = credentials_encoder_for(@mechanism)
         | 
| 193 194 | 
             
                  @locale              = @opts.fetch(:locale, DEFAULT_LOCALE)
         | 
| @@ -817,7 +818,7 @@ module Bunny | |
| 817 818 | 
             
                    shut_down_all_consumer_work_pools!
         | 
| 818 819 | 
             
                    maybe_shutdown_reader_loop
         | 
| 819 820 | 
             
                    maybe_shutdown_heartbeat_sender
         | 
| 820 | 
            -
                  rescue ShutdownSignal =>  | 
| 821 | 
            +
                  rescue ShutdownSignal => _sse
         | 
| 821 822 | 
             
                    # no-op
         | 
| 822 823 | 
             
                  rescue Exception => e
         | 
| 823 824 | 
             
                    @logger.warn "Caught an exception when cleaning up after receiving connection.close: #{e.message}"
         | 
| @@ -1208,7 +1209,7 @@ module Bunny | |
| 1208 1209 | 
             
                      begin
         | 
| 1209 1210 | 
             
                        shut_down_all_consumer_work_pools!
         | 
| 1210 1211 | 
             
                        maybe_shutdown_reader_loop
         | 
| 1211 | 
            -
                      rescue ShutdownSignal =>  | 
| 1212 | 
            +
                      rescue ShutdownSignal => _sse
         | 
| 1212 1213 | 
             
                        # no-op
         | 
| 1213 1214 | 
             
                      rescue Exception => e
         | 
| 1214 1215 | 
             
                        @logger.warn "Caught an exception when cleaning up after receiving connection.close: #{e.message}"
         | 
    
        data/lib/bunny/transport.rb
    CHANGED
    
    | @@ -4,7 +4,7 @@ require "monitor" | |
| 4 4 |  | 
| 5 5 | 
             
            begin
         | 
| 6 6 | 
             
              require "openssl"
         | 
| 7 | 
            -
            rescue LoadError =>  | 
| 7 | 
            +
            rescue LoadError => _le
         | 
| 8 8 | 
             
              $stderr.puts "Could not load OpenSSL"
         | 
| 9 9 | 
             
            end
         | 
| 10 10 |  | 
| @@ -92,7 +92,7 @@ module Bunny | |
| 92 92 | 
             
                end
         | 
| 93 93 |  | 
| 94 94 | 
             
                def connected?
         | 
| 95 | 
            -
                  : | 
| 95 | 
            +
                  :connected == @status && open?
         | 
| 96 96 | 
             
                end
         | 
| 97 97 |  | 
| 98 98 | 
             
                def configure_socket(&block)
         | 
| @@ -263,7 +263,7 @@ module Bunny | |
| 263 263 | 
             
                      :connect_timeout => timeout)
         | 
| 264 264 |  | 
| 265 265 | 
             
                    true
         | 
| 266 | 
            -
                  rescue SocketError, Timeout::Error =>  | 
| 266 | 
            +
                  rescue SocketError, Timeout::Error => _e
         | 
| 267 267 | 
             
                    false
         | 
| 268 268 | 
             
                  ensure
         | 
| 269 269 | 
             
                    s.close if s
         | 
| @@ -318,7 +318,7 @@ module Bunny | |
| 318 318 | 
             
                def tls_certificate_from(opts)
         | 
| 319 319 | 
             
                  begin
         | 
| 320 320 | 
             
                    read_client_certificate!
         | 
| 321 | 
            -
                  rescue MissingTLSCertificateFile =>  | 
| 321 | 
            +
                  rescue MissingTLSCertificateFile => _e
         | 
| 322 322 | 
             
                    inline_client_certificate_from(opts)
         | 
| 323 323 | 
             
                  end
         | 
| 324 324 | 
             
                end
         | 
| @@ -326,7 +326,7 @@ module Bunny | |
| 326 326 | 
             
                def tls_key_from(opts)
         | 
| 327 327 | 
             
                  begin
         | 
| 328 328 | 
             
                    read_client_key!
         | 
| 329 | 
            -
                  rescue MissingTLSKeyFile =>  | 
| 329 | 
            +
                  rescue MissingTLSKeyFile => _e
         | 
| 330 330 | 
             
                    inline_client_key_from(opts)
         | 
| 331 331 | 
             
                  end
         | 
| 332 332 | 
             
                end
         | 
| @@ -364,6 +364,11 @@ module Bunny | |
| 364 364 | 
             
                  raise "cannot wrap a socket into TLS socket, @tls_context is nil. This is a Bunny bug." unless @tls_context
         | 
| 365 365 |  | 
| 366 366 | 
             
                  s = Bunny::SSLSocketImpl.new(socket, @tls_context)
         | 
| 367 | 
            +
             | 
| 368 | 
            +
                  # always set the SNI server name if possible since RFC 3546 and RFC 6066 both state
         | 
| 369 | 
            +
                  # that TLS clients supporting the extensions can talk to TLS servers that do not
         | 
| 370 | 
            +
                  s.hostname = @host if s.respond_to?(:hostname)
         | 
| 371 | 
            +
             | 
| 367 372 | 
             
                  s.sync_close = true
         | 
| 368 373 | 
             
                  s
         | 
| 369 374 | 
             
                end
         | 
| @@ -450,9 +455,9 @@ but prone to man-in-the-middle attacks. Please set verify_peer: true in producti | |
| 450 455 | 
             
                  cert_files = []
         | 
| 451 456 | 
             
                  cert_inlines = []
         | 
| 452 457 | 
             
                  certs.each do |cert|
         | 
| 453 | 
            -
                    # if it starts with / then it's a file path that may or may not
         | 
| 454 | 
            -
                    #  | 
| 455 | 
            -
                    if File.readable?(cert) || cert =~  | 
| 458 | 
            +
                    # if it starts with / or C:/ then it's a file path that may or may not
         | 
| 459 | 
            +
                    # exist (e.g. a default OpenSSL path). MK.
         | 
| 460 | 
            +
                    if File.readable?(cert) || cert =~ /^([a-z]:?)?\//i
         | 
| 456 461 | 
             
                      cert_files.push(cert)
         | 
| 457 462 | 
             
                    else
         | 
| 458 463 | 
             
                      cert_inlines.push(cert)
         | 
    
        data/lib/bunny/version.rb
    CHANGED
    
    
    
        data/spec/config/rabbitmq.config
    CHANGED
    
    | @@ -2,12 +2,13 @@ | |
| 2 2 |  | 
| 3 3 | 
             
              {rabbit, [
         | 
| 4 4 | 
             
                {ssl_listeners, [5671]},
         | 
| 5 | 
            -
                {ssl_options, [{cacertfile,"spec/tls/ | 
| 6 | 
            -
                               {certfile,"spec/tls/ | 
| 7 | 
            -
                               {keyfile,"spec/tls/server_key.pem"},
         | 
| 5 | 
            +
                {ssl_options, [{cacertfile,"/spec/tls/ca_certificate.pem"},
         | 
| 6 | 
            +
                               {certfile,"/spec/tls/server_certificate.pem"},
         | 
| 7 | 
            +
                               {keyfile,"/spec/tls/server_key.pem"},
         | 
| 8 8 | 
             
                               {verify,verify_none},
         | 
| 9 | 
            -
                               {fail_if_no_peer_cert,false}]} | 
| 10 | 
            -
             | 
| 9 | 
            +
                               {fail_if_no_peer_cert,false}]},
         | 
| 10 | 
            +
                {loopback_users, []}
         | 
| 11 | 
            +
              ] },
         | 
| 11 12 |  | 
| 12 13 | 
             
              {rabbitmq_management,
         | 
| 13 14 | 
             
                [{listener,
         | 
| @@ -316,6 +316,7 @@ describe "Connection recovery" do | |
| 316 316 | 
             
                  delivered = false
         | 
| 317 317 |  | 
| 318 318 | 
             
                  ch = c.create_channel
         | 
| 319 | 
            +
                  ch.confirm_select
         | 
| 319 320 | 
             
                  q  = ch.queue("", exclusive: true)
         | 
| 320 321 | 
             
                  q.subscribe do |_, _, _|
         | 
| 321 322 | 
             
                    delivered = true
         | 
| @@ -325,13 +326,14 @@ describe "Connection recovery" do | |
| 325 326 | 
             
                  expect(ch).to be_open
         | 
| 326 327 |  | 
| 327 328 | 
             
                  q.publish("")
         | 
| 329 | 
            +
                  ch.wait_for_confirms
         | 
| 328 330 |  | 
| 329 331 | 
             
                  poll_until { delivered }
         | 
| 330 332 | 
             
                end
         | 
| 331 333 | 
             
              end
         | 
| 332 334 |  | 
| 333 335 | 
             
              it "recovers all consumers" do
         | 
| 334 | 
            -
                n =  | 
| 336 | 
            +
                n = 32
         | 
| 335 337 |  | 
| 336 338 | 
             
                with_open do |c|
         | 
| 337 339 | 
             
                  ch = c.create_channel
         | 
| @@ -347,7 +349,7 @@ describe "Connection recovery" do | |
| 347 349 | 
             
              end
         | 
| 348 350 |  | 
| 349 351 | 
             
              it "recovers all queues" do
         | 
| 350 | 
            -
                n =  | 
| 352 | 
            +
                n = 32
         | 
| 351 353 |  | 
| 352 354 | 
             
                qs = []
         | 
| 353 355 |  | 
| @@ -385,6 +387,16 @@ describe "Connection recovery" do | |
| 385 387 | 
             
              end
         | 
| 386 388 |  | 
| 387 389 | 
             
              def close_all_connections!
         | 
| 390 | 
            +
                # let whatever actions were taken before
         | 
| 391 | 
            +
                # this call a chance to propagate, e.g. to make
         | 
| 392 | 
            +
                # sure that connections are accounted for in the
         | 
| 393 | 
            +
                # stats DB.
         | 
| 394 | 
            +
                #
         | 
| 395 | 
            +
                # See bin/ci/before_build for management plugin
         | 
| 396 | 
            +
                # pre-configuration.
         | 
| 397 | 
            +
                #
         | 
| 398 | 
            +
                # MK.
         | 
| 399 | 
            +
                sleep 1.1
         | 
| 388 400 | 
             
                connections.each do |conn_info|
         | 
| 389 401 | 
             
                  close_ignoring_permitted_exceptions(conn_info.name)
         | 
| 390 402 | 
             
                end
         | 
| @@ -401,14 +413,14 @@ describe "Connection recovery" do | |
| 401 413 | 
             
              end
         | 
| 402 414 |  | 
| 403 415 | 
             
              def poll_while(&probe)
         | 
| 404 | 
            -
                Timeout | 
| 405 | 
            -
                  sleep 0.1 while probe | 
| 416 | 
            +
                Timeout.timeout(20) {
         | 
| 417 | 
            +
                  sleep 0.1 while probe.call
         | 
| 406 418 | 
             
                }
         | 
| 407 419 | 
             
              end
         | 
| 408 420 |  | 
| 409 421 | 
             
              def poll_until(&probe)
         | 
| 410 | 
            -
                Timeout | 
| 411 | 
            -
                  sleep 0.1 until probe | 
| 422 | 
            +
                Timeout.timeout(20) {
         | 
| 423 | 
            +
                  sleep 0.1 until probe.call
         | 
| 412 424 | 
             
                }
         | 
| 413 425 | 
             
              end
         | 
| 414 426 |  | 
| @@ -4,6 +4,16 @@ describe Bunny::Session do | |
| 4 4 | 
             
              let(:http_client) { RabbitMQ::HTTP::Client.new("http://127.0.0.1:15672") }
         | 
| 5 5 |  | 
| 6 6 | 
             
              def close_connection(client_port)
         | 
| 7 | 
            +
                # let whatever actions were taken before
         | 
| 8 | 
            +
                # this call a chance to propagate, e.g. to make
         | 
| 9 | 
            +
                # sure that connections are accounted for in the
         | 
| 10 | 
            +
                # stats DB.
         | 
| 11 | 
            +
                #
         | 
| 12 | 
            +
                # See bin/ci/before_build for management plugin
         | 
| 13 | 
            +
                # pre-configuration.
         | 
| 14 | 
            +
                #
         | 
| 15 | 
            +
                # MK.
         | 
| 16 | 
            +
                sleep 1.1
         | 
| 7 17 | 
             
                c = http_client.
         | 
| 8 18 | 
             
                  list_connections.
         | 
| 9 19 | 
             
                  find   { |conn_info| conn_info && conn_info.peer_port.to_i == client_port }
         | 
| @@ -12,7 +22,7 @@ describe Bunny::Session do | |
| 12 22 | 
             
              end
         | 
| 13 23 |  | 
| 14 24 | 
             
              def wait_for_recovery
         | 
| 15 | 
            -
                sleep  | 
| 25 | 
            +
                sleep 1.5
         | 
| 16 26 | 
             
              end
         | 
| 17 27 |  | 
| 18 28 | 
             
              it "can be closed" do
         | 
| @@ -58,6 +68,7 @@ describe Bunny::Session do | |
| 58 68 | 
             
                  c.start
         | 
| 59 69 | 
             
                  ch = c.create_channel
         | 
| 60 70 |  | 
| 71 | 
            +
                  sleep 1.5
         | 
| 61 72 | 
             
                  expect(c).to be_open
         | 
| 62 73 | 
             
                  sleep 1.5
         | 
| 63 74 | 
             
                  close_connection(c.local_port)
         | 
| @@ -98,17 +98,18 @@ describe Bunny::Exchange do | |
| 98 98 |  | 
| 99 99 | 
             
                context "when declared with a different set of attributes" do
         | 
| 100 100 | 
             
                  it "raises an exception" do
         | 
| 101 | 
            -
                     | 
| 101 | 
            +
                    ch1   = connection.create_channel
         | 
| 102 | 
            +
                    ch2   = connection.create_channel
         | 
| 102 103 |  | 
| 103 | 
            -
                    x =  | 
| 104 | 
            +
                    x = ch1.fanout("bunny.tests.exchanges.fanout", auto_delete: true, durable: false)
         | 
| 104 105 | 
             
                    expect {
         | 
| 105 106 | 
             
                      # force re-declaration
         | 
| 106 | 
            -
                       | 
| 107 | 
            +
                      ch2.exchange_declare("bunny.tests.exchanges.fanout", :direct, auto_delete: false, durable: true)
         | 
| 107 108 | 
             
                    }.to raise_error(Bunny::PreconditionFailed)
         | 
| 108 109 |  | 
| 109 | 
            -
                    expect( | 
| 110 | 
            +
                    expect(ch2).to be_closed
         | 
| 110 111 | 
             
                    expect {
         | 
| 111 | 
            -
                       | 
| 112 | 
            +
                      ch2.fanout("bunny.tests.exchanges.fanout", auto_delete: true, durable: false)
         | 
| 112 113 | 
             
                    }.to raise_error(Bunny::ChannelAlreadyClosed)
         | 
| 113 114 | 
             
                  end
         | 
| 114 115 | 
             
                end
         | 
| @@ -30,6 +30,44 @@ unless ENV["CI"] | |
| 30 30 | 
             
                end
         | 
| 31 31 | 
             
              end
         | 
| 32 32 |  | 
| 33 | 
            +
              def local_hostname
         | 
| 34 | 
            +
                ENV.fetch("BUNNY_RABBITMQ_HOSTNAME", "127.0.0.1")
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              context "initialized with :tls => true" do
         | 
| 38 | 
            +
                let(:subject) do
         | 
| 39 | 
            +
                  Bunny.new(:user     => "bunny_gem",
         | 
| 40 | 
            +
                    :password => "bunny_password",
         | 
| 41 | 
            +
                    :vhost    => "bunny_testbed",
         | 
| 42 | 
            +
                    :tls                   => true,
         | 
| 43 | 
            +
                    :verify_peer           => verify_peer,
         | 
| 44 | 
            +
                    :tls_cert              => "spec/tls/client_certificate.pem",
         | 
| 45 | 
            +
                    :tls_key               => "spec/tls/client_key.pem",
         | 
| 46 | 
            +
                    :tls_ca_certificates   => ["./spec/tls/ca_certificate.pem"])
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                context "peer verification is off" do
         | 
| 50 | 
            +
                  let(:verify_peer) { false }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  it "uses TLS port" do
         | 
| 53 | 
            +
                    expect(subject.port).to eq AMQ::Protocol::TLS_PORT
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  it "sends the SNI details" do
         | 
| 57 | 
            +
                    # https://github.com/ruby-amqp/bunny/issues/440
         | 
| 58 | 
            +
                    subject.start
         | 
| 59 | 
            +
                    expect(subject.transport.socket.hostname).to_not be_empty
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                context "peer verification is on" do
         | 
| 64 | 
            +
                  let(:verify_peer) { true }
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  it "uses TLS port" do
         | 
| 67 | 
            +
                    expect(subject.port).to eq AMQ::Protocol::TLS_PORT
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 33 71 |  | 
| 34 72 | 
             
              describe "TLS connection to RabbitMQ with client certificates" do
         | 
| 35 73 | 
             
                let(:connection) do
         | 
| @@ -75,7 +113,7 @@ unless ENV["CI"] | |
| 75 113 |  | 
| 76 114 | 
             
              describe "TLS connection to RabbitMQ with a connection string" do
         | 
| 77 115 | 
             
                let(:connection) do
         | 
| 78 | 
            -
                  c = Bunny.new("amqps://bunny_gem:bunny_password | 
| 116 | 
            +
                  c = Bunny.new("amqps://bunny_gem:bunny_password@#{local_hostname}/bunny_testbed",
         | 
| 79 117 | 
             
                    tls_cert: "spec/tls/client_certificate.pem",
         | 
| 80 118 | 
             
                    tls_key: "spec/tls/client_key.pem",
         | 
| 81 119 | 
             
                    tls_ca_certificates: ["./spec/tls/ca_certificate.pem"],
         | 
| @@ -94,9 +132,9 @@ unless ENV["CI"] | |
| 94 132 |  | 
| 95 133 | 
             
              describe "TLS connection to RabbitMQ with a connection string and w/o client certificate and key" do
         | 
| 96 134 | 
             
                let(:connection) do
         | 
| 97 | 
            -
                  c = Bunny.new("amqps://bunny_gem:bunny_password | 
| 135 | 
            +
                  c = Bunny.new("amqps://bunny_gem:bunny_password@#{local_hostname}/bunny_testbed",
         | 
| 98 136 | 
             
                    tls_ca_certificates: ["./spec/tls/ca_certificate.pem"],
         | 
| 99 | 
            -
                    verify_peer:  | 
| 137 | 
            +
                    verify_peer: verify_peer)
         | 
| 100 138 | 
             
                  c.start
         | 
| 101 139 | 
             
                  c
         | 
| 102 140 | 
             
                end
         | 
| @@ -105,7 +143,27 @@ unless ENV["CI"] | |
| 105 143 | 
             
                  connection.close
         | 
| 106 144 | 
             
                end
         | 
| 107 145 |  | 
| 108 | 
            -
                 | 
| 146 | 
            +
                context "peer verification is off" do
         | 
| 147 | 
            +
                  let(:verify_peer) { false }
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                  include_examples "successful TLS connection"
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  it "sends the SNI details" do
         | 
| 152 | 
            +
                    # https://github.com/ruby-amqp/bunny/issues/440
         | 
| 153 | 
            +
                    expect(connection.transport.socket.hostname).to_not be_empty
         | 
| 154 | 
            +
                  end
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                context "peer verification is on" do
         | 
| 158 | 
            +
                  let(:verify_peer) { true }
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                  include_examples "successful TLS connection"
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                  it "sends the SNI details" do
         | 
| 163 | 
            +
                    # https://github.com/ruby-amqp/bunny/issues/440
         | 
| 164 | 
            +
                    expect(connection.transport.socket.hostname).to_not be_empty
         | 
| 165 | 
            +
                  end
         | 
| 166 | 
            +
                end
         | 
| 109 167 | 
             
              end
         | 
| 110 168 |  | 
| 111 169 |  | 
| @@ -5,7 +5,7 @@ unless ENV["CI"] | |
| 5 5 | 
             
              describe "Concurrent consumers sharing a connection" do
         | 
| 6 6 | 
             
                before :all do
         | 
| 7 7 | 
             
                  @connection = Bunny.new(username: "bunny_gem", password: "bunny_password", vhost: "bunny_testbed",
         | 
| 8 | 
            -
                                automatic_recovery: false)
         | 
| 8 | 
            +
                                automatic_recovery: false, continuation_timeout: 45000)
         | 
| 9 9 | 
             
                  @connection.start
         | 
| 10 10 | 
             
                end
         | 
| 11 11 |  | 
| @@ -20,7 +20,7 @@ unless ENV["CI"] | |
| 20 20 | 
             
                context "when publishing thousands of messages over 128K in size" do
         | 
| 21 21 | 
             
                  let(:colors) { ["red", "blue", "white"] }
         | 
| 22 22 |  | 
| 23 | 
            -
                  let(:n) {  | 
| 23 | 
            +
                  let(:n) { 16 }
         | 
| 24 24 | 
             
                  let(:m) { 5000 }
         | 
| 25 25 |  | 
| 26 26 | 
             
                  it "successfully drain all queues" do
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            #!/bin/sh
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            DIRNAME=$(dirname "$0")
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            openssl req -sha256 -new -key $DIRNAME/server_key.pem -out $DIRNAME/server.csr -subj "/CN=mercurio" -config $DIRNAME/server-openssl.cnf
         | 
| 6 | 
            +
            openssl x509 -sha256 -req -in $DIRNAME/server.csr -CA $DIRNAME/ca_certificate.pem -CAkey $DIRNAME/ca_key.pem -CAcreateserial -CAserial $DIRNAME/ca.srl -out $DIRNAME/server_certificate.pem -days 3650 -extensions v3_req -extfile $DIRNAME/server-openssl.cnf
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            echo "Written new server CSR and certificate"
         | 
| @@ -0,0 +1,10 @@ | |
| 1 | 
            +
            [req]
         | 
| 2 | 
            +
            req_extensions = v3_req
         | 
| 3 | 
            +
            distinguished_name = req_distinguished_name
         | 
| 4 | 
            +
            [req_distinguished_name]
         | 
| 5 | 
            +
            [ v3_req ]
         | 
| 6 | 
            +
            basicConstraints = CA:FALSE
         | 
| 7 | 
            +
            keyUsage = nonRepudiation, digitalSignature, keyEncipherment
         | 
| 8 | 
            +
            subjectAltName = @alt_names
         | 
| 9 | 
            +
            [alt_names]
         | 
| 10 | 
            +
            IP.1 = 127.0.0.1
         | 
    
        data/spec/tls/server.csr
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE REQUEST-----
         | 
| 2 | 
            +
            MIICkjCCAXoCAQAwEzERMA8GA1UEAwwIbWVyY3VyaW8wggEiMA0GCSqGSIb3DQEB
         | 
| 3 | 
            +
            AQUAA4IBDwAwggEKAoIBAQCkvvzm5nB3CDqTFEYQnfOy8DwJLm34MvdrKQAThzDy
         | 
| 4 | 
            +
            qa37sb4IC0YclBFbZfsw8+paK+Rpo2Vlhzclb66z0cGs9SvxuKkJ45w0fk0ctxMg
         | 
| 5 | 
            +
            tvWISRGZR7LMw5u0q2m61dK0FTGSl+qzJohb5Dklb6BApoGoIPH+eYraVxHR29x2
         | 
| 6 | 
            +
            x8hqzBt5TpiUW8bu7LPQJbX0mYGhKQDf86kao+sptRQ2045D7vB3jrkPhq0XZVJi
         | 
| 7 | 
            +
            QymzOSSejYSN1oZ464DtT+dpLBYHEVJoJPu4r4kY/8A7v+93PWQaDERKBfvwWHfV
         | 
| 8 | 
            +
            U44xn7R/aojSvNT7kQILsf2BnfJlMwoedWQLxPddmB3PAgMBAAGgOjA4BgkqhkiG
         | 
| 9 | 
            +
            9w0BCQ4xKzApMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMA8GA1UdEQQIMAaHBH8A
         | 
| 10 | 
            +
            AAEwDQYJKoZIhvcNAQELBQADggEBAFyfaotajM/h2dyodKJqO6stAIpxiQXTds8V
         | 
| 11 | 
            +
            5ZHDozBxzLZkeBIY+hsqh/owmqomk56swui+336WAKIBwIJyJrtIl8C/lupGaTbR
         | 
| 12 | 
            +
            BouWWbyZOQAE2ExHcUgdGEOVoCN2ieBR4RVQ8Id4GAlHvlFGPqakaLMV6Zc7VqDh
         | 
| 13 | 
            +
            vxdOLgATEE+MhebTo9yOHj14qdvzhi5w3ZEg1kdfOuGN9I4gJcv4PWwudBhn4wE7
         | 
| 14 | 
            +
            oHAIP2nixROI7cZcZ9fBrimcdGQsXNZLTXiGzNra4utOXuQ7w5qoiEhHoxXalowE
         | 
| 15 | 
            +
            KvEA9otLadjtULg6DRd3zYuIyrUiBIRUHZ1p2xSnd/lLekbMfCQ=
         | 
| 16 | 
            +
            -----END CERTIFICATE REQUEST-----
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: bunny
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.6. | 
| 4 | 
            +
              version: 2.6.5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Chris Duncan
         | 
| @@ -12,7 +12,7 @@ authors: | |
| 12 12 | 
             
            autorequire: 
         | 
| 13 13 | 
             
            bindir: bin
         | 
| 14 14 | 
             
            cert_chain: []
         | 
| 15 | 
            -
            date: 2017- | 
| 15 | 
            +
            date: 2017-04-15 00:00:00.000000000 Z
         | 
| 16 16 | 
             
            dependencies:
         | 
| 17 17 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 18 18 | 
             
              name: amq-protocol
         | 
| @@ -20,14 +20,14 @@ dependencies: | |
| 20 20 | 
             
                requirements:
         | 
| 21 21 | 
             
                - - ">="
         | 
| 22 22 | 
             
                  - !ruby/object:Gem::Version
         | 
| 23 | 
            -
                    version: 2.0 | 
| 23 | 
            +
                    version: 2.1.0
         | 
| 24 24 | 
             
              type: :runtime
         | 
| 25 25 | 
             
              prerelease: false
         | 
| 26 26 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 27 27 | 
             
                requirements:
         | 
| 28 28 | 
             
                - - ">="
         | 
| 29 29 | 
             
                  - !ruby/object:Gem::Version
         | 
| 30 | 
            -
                    version: 2.0 | 
| 30 | 
            +
                    version: 2.1.0
         | 
| 31 31 | 
             
            description: Easy to use, feature complete Ruby client for RabbitMQ 3.3 and later
         | 
| 32 32 | 
             
              versions.
         | 
| 33 33 | 
             
            email:
         | 
| @@ -59,8 +59,8 @@ files: | |
| 59 59 | 
             
            - benchmarks/synchronized_sorted_set.rb
         | 
| 60 60 | 
             
            - benchmarks/write_vs_write_nonblock.rb
         | 
| 61 61 | 
             
            - bin/ci/before_build
         | 
| 62 | 
            -
            - bin/ci/start_rabbitmq
         | 
| 63 62 | 
             
            - bunny.gemspec
         | 
| 63 | 
            +
            - docker-compose.yml
         | 
| 64 64 | 
             
            - docker/Dockerfile
         | 
| 65 65 | 
             
            - docker/docker-entrypoint.sh
         | 
| 66 66 | 
             
            - examples/connection/authentication_failure.rb
         | 
| @@ -199,6 +199,9 @@ files: | |
| 199 199 | 
             
            - spec/tls/ca_key.pem
         | 
| 200 200 | 
             
            - spec/tls/client_certificate.pem
         | 
| 201 201 | 
             
            - spec/tls/client_key.pem
         | 
| 202 | 
            +
            - spec/tls/generate-server-cert.sh
         | 
| 203 | 
            +
            - spec/tls/server-openssl.cnf
         | 
| 204 | 
            +
            - spec/tls/server.csr
         | 
| 202 205 | 
             
            - spec/tls/server_certificate.pem
         | 
| 203 206 | 
             
            - spec/tls/server_key.pem
         | 
| 204 207 | 
             
            - spec/unit/bunny_spec.rb
         | 
| @@ -228,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 228 231 | 
             
                  version: '0'
         | 
| 229 232 | 
             
            requirements: []
         | 
| 230 233 | 
             
            rubyforge_project: 
         | 
| 231 | 
            -
            rubygems_version: 2. | 
| 234 | 
            +
            rubygems_version: 2.6.11
         | 
| 232 235 | 
             
            signing_key: 
         | 
| 233 236 | 
             
            specification_version: 4
         | 
| 234 237 | 
             
            summary: Popular easy to use Ruby client for RabbitMQ
         | 
| @@ -297,6 +300,9 @@ test_files: | |
| 297 300 | 
             
            - spec/tls/ca_key.pem
         | 
| 298 301 | 
             
            - spec/tls/client_certificate.pem
         | 
| 299 302 | 
             
            - spec/tls/client_key.pem
         | 
| 303 | 
            +
            - spec/tls/generate-server-cert.sh
         | 
| 304 | 
            +
            - spec/tls/server-openssl.cnf
         | 
| 305 | 
            +
            - spec/tls/server.csr
         | 
| 300 306 | 
             
            - spec/tls/server_certificate.pem
         | 
| 301 307 | 
             
            - spec/tls/server_key.pem
         | 
| 302 308 | 
             
            - spec/unit/bunny_spec.rb
         |