Skip to content

Commit

Permalink
Merge pull request #1325 from camlow325/feature/master/PDB-2640-allow…
Browse files Browse the repository at this point in the history
…-gzip-request-body-option-for-ruby-http-client

(PDB-2640) Add `:compress` option to Ruby http_client post
  • Loading branch information
jpinsonault committed Feb 13, 2017
2 parents d44655c + b7d8ff4 commit 78dd43a
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 2 deletions.
2 changes: 1 addition & 1 deletion project.clj
Expand Up @@ -32,7 +32,7 @@

:min-lein-version "2.7.1"

:parent-project {:coords [puppetlabs/clj-parent "0.4.0"]
:parent-project {:coords [puppetlabs/clj-parent "0.4.1"]
:inherit [:managed-dependencies]}

:dependencies [[org.clojure/clojure]
Expand Down
12 changes: 12 additions & 0 deletions src/ruby/puppetserver-lib/puppet/server/http_client.rb
Expand Up @@ -7,6 +7,7 @@
require 'java'
java_import com.puppetlabs.http.client.RequestOptions
java_import com.puppetlabs.http.client.ClientOptions
java_import com.puppetlabs.http.client.CompressType
java_import com.puppetlabs.http.client.ResponseBodyType
SyncHttpClient = com.puppetlabs.http.client.Sync

Expand Down Expand Up @@ -73,6 +74,17 @@ def post(url, body, headers, options = {})
request_options.set_headers(headers)
request_options.set_as(ResponseBodyType::TEXT)
request_options.set_body(body)

compress = options[:compress]
if compress
compress_as_sym = compress.to_sym
if compress_as_sym == :gzip
request_options.set_compress_request_body(CompressType::GZIP)
else
raise ArgumentError, "Unsupported compression specified for request: #{compress}"
end
end

response = self.class.client_post(request_options)
ruby_response(response)
end
Expand Down
38 changes: 37 additions & 1 deletion test/unit/puppetlabs/puppetserver/ruby/http_client_test.clj
Expand Up @@ -3,7 +3,8 @@
(org.apache.http ConnectionClosedException)
(javax.net.ssl SSLHandshakeException)
(java.util HashMap)
(java.io IOException))
(java.io IOException)
(java.util.zip GZIPInputStream))
(:require [clojure.test :refer :all]
[puppetlabs.trapperkeeper.testutils.logging :as logutils]
[puppetlabs.trapperkeeper.testutils.webserver :as jetty9]
Expand Down Expand Up @@ -40,6 +41,14 @@
:body (str "The Connection header has value "
((:headers req) "connection"))})

(defn ring-app-decompressing-gzipped-request
[req]
{:status 200
:body (-> req
:body
(GZIPInputStream.)
slurp)})

(defn authenticated? [name pass]
(and (= name "foo")
(= pass "bar")))
Expand Down Expand Up @@ -191,6 +200,33 @@ jruby-config :- jruby-schemas/JRubyConfig
(is (= "401" (.runScriptlet sc "$response.code")))
(is (= "access denied" (.runScriptlet sc "$response.body"))))))))

(deftest http-compressed-requests
(jetty9/with-test-webserver ring-app-decompressing-gzipped-request port
(with-scripting-container sc
(with-http-client sc port {:use-ssl false}
(testing "GZIP compression format"
(let [compress "{ :compress => :gzip }"
body "howdy"]
(.runScriptlet sc (format "$response = $c.post('/', '%s', {}, %s)"
body
compress))
(is (= "200" (.runScriptlet sc "$response.code")))
(is (= body (.runScriptlet sc "$response.body")))))

(testing "invalid compression format"
(let [compress "{ :compress => :bunk }"]
(is (= "Unsupported compression specified for request: bunk"
(.runScriptlet
sc
(str "begin;"
" $response = $c.post('/', 'foo', {}, "
compress
");"
" 'No error raised from post';"
"rescue ArgumentError => e;"
" e.message;"
"end"))))))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; SSL Tests

Expand Down

0 comments on commit 78dd43a

Please sign in to comment.