# 0.14.0 ## Features ### GRPC plugin A new plugin, `:grpc`, is now available. This plugin provides a simple DSL to build GRPC services and performing calls using `httpx` under the hood. Example: ```ruby require "httpx" grpc = HTTPX.plugin(:grpc) helloworld_stub = grpc.build_stub("localhost:4545") helloworld_svc = helloworld_stub.rpc(:SayHello, HelloRequest, HelloReply) result = helloworld_svc.say_hello(HelloRequest.new(name: "Jack")) #=> HelloReply: "Hello Jack" ``` You can read more about the `:grpc` plugin in the [wiki](https://honeyryderchuck.gitlab.io/httpx/wiki/GRPC). ### :origin A new `:origin` option is available. You can use it for setting a base URL for subsequent relative paths on that session: ```ruby HTTPX.get("/httpbin/get") #=> HTTPX::Error: invalid URI: /httpbin/get httpbin = HTTPX.with(origin: "https://nghttp2.org") httpbin.get("/httpbin/get") #=> # NoMethodError # after #=> HTTPX::Error: unknown option: foo ``` * `HTTPX::Options#def_option` (which can be used for setting custom plugin options) can now be passed a full body string (where the argument is `value`), although it still support the block form. This is the recommended approach, as the block form is based on `define_method`, which would make clients unusable inside ractors. * Added support for `:wait_for_handshake` under the `http2_settings` option (`false` by default). HTTP/2 connections complete the protocol handshake before requests are sent. When this option is `true`, requests get send in the initial payload, before the HTTP/2 connection is fully acknowledged. * 441716a5ac0f7707211ebe0048f568cf0b759c3f: The `:stream` plugin has been improved to start streaming the real response as methods are called (instead of a completely separate synchronous one, which is definitely not good): ```ruby session = HTTPX.plugin(:stream) response = session.get(build_uri("/stream/3"), stream: true) # before response.status # this could block indefinitely, if the request truly streams infinitely. # after response.status # sends the request, and starts streaming the response until status is available. response.each {|chunk|...} # and now you can start yielding the chunks... ``` ## Bugfixes * fixed usage of the `:multipart` if `pathname` isn't loaded. * fixed HTTP/2 trailers. * fixed connection merges with the same origin, which was causing them to be duplicated and breaking further usage. (#125) * fixed repeated session callbacks on a connection, by ensure they're set only once. * fixed calculation of `content-length` for streaming or chunked compressed requests. ## Chore * using ruby base container images in CI instead. * using truffleruby official container image.