From 58211080695ab5fddc5bc25cd52b1e1e6d1b468d Mon Sep 17 00:00:00 2001 From: mstate Date: Fri, 15 Mar 2024 17:17:18 -0400 Subject: [PATCH 1/5] allow defining clients on initialization --- lib/async/http/internet.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/async/http/internet.rb b/lib/async/http/internet.rb index f7440841..fd326957 100644 --- a/lib/async/http/internet.rb +++ b/lib/async/http/internet.rb @@ -14,7 +14,7 @@ module Async module HTTP class Internet def initialize(**options) - @clients = Hash.new + @clients = options.delete(:clients) || Hash.new @options = options end From e95a88b8e8f44847e1b08f0cbc6332ce739eafec Mon Sep 17 00:00:00 2001 From: mstate Date: Mon, 18 Mar 2024 09:10:41 -0400 Subject: [PATCH 2/5] Update readme.md to show example of passing clients --- readme.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/readme.md b/readme.md index 6eb705a9..da47d35d 100644 --- a/readme.md +++ b/readme.md @@ -247,6 +247,45 @@ Async do end ``` +### Private Certificate Authentication Verification + +You provide private certificates for authentication. + +``` ruby +require 'async' +require 'async/http' + +# These are generated from a signed certificate request. +ssl_private_key = OpenSSL::PKey::RSA.new(ENV['PRIVATE_SSL_KEY_AS_STRING'])) +ssl_certificate = OpenSSL::X509::Certificate.new(OpenSSL::X509::Certificate.new(ENV['PUBLIC_SSL_CERTIFICATE_AS_STRING']) + +ssl_context = OpenSSL::SSL::SSLContext.new.tap do |context| + context.cert = ssl_certificate + context.key = ssl_private_key + end +api_url = 'https://www.example-api.com' +auth_url = 'https://www.example-auth.com' + +api_endpoint = Async::HTTP::Endpoint.parse(api_url, ssl_context: ssl_context) +auth_endpoint = Async::HTTP::Endpoint.parse(auth_url, ssl_context: ssl_context) + +clients = { + api_url => Async::HTTP::Client.new(api_endpoint), + auth_url => Async::HTTP::Client.new(auth_endpoint) +} + + +Async do + internet = Async::HTTP::Internet.new(clients: clients) + token_response = internet.get("#{internet}/auth/token") + token = JSON.parse(token_response.read).dig("token") + headers = [['Authorization', "Bearer #{token}"]] + widgets_response = internet.get("#{api_url}/widgets", headers ) + + pp widgets_response.status, widgets_response.headers.fields, widgets_response.read +end +``` + ### Timeouts Here's a basic example with a timeout: From e9616d5be94f9f2312baa41a02202528b64af531 Mon Sep 17 00:00:00 2001 From: mstate Date: Mon, 18 Mar 2024 09:11:29 -0400 Subject: [PATCH 3/5] Removed extra word --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index da47d35d..9b9a7314 100644 --- a/readme.md +++ b/readme.md @@ -247,7 +247,7 @@ Async do end ``` -### Private Certificate Authentication Verification +### Private Certificate Authentication You provide private certificates for authentication. From 34750cef2063c08f470e94f9c1af3b9dd77fe11b Mon Sep 17 00:00:00 2001 From: mstate Date: Mon, 18 Mar 2024 09:12:10 -0400 Subject: [PATCH 4/5] Formatting --- readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 9b9a7314..a38524fa 100644 --- a/readme.md +++ b/readme.md @@ -260,9 +260,9 @@ ssl_private_key = OpenSSL::PKey::RSA.new(ENV['PRIVATE_SSL_KEY_AS_STRING'])) ssl_certificate = OpenSSL::X509::Certificate.new(OpenSSL::X509::Certificate.new(ENV['PUBLIC_SSL_CERTIFICATE_AS_STRING']) ssl_context = OpenSSL::SSL::SSLContext.new.tap do |context| - context.cert = ssl_certificate - context.key = ssl_private_key - end + context.cert = ssl_certificate + context.key = ssl_private_key +end api_url = 'https://www.example-api.com' auth_url = 'https://www.example-auth.com' From f42da98d522da3dde89508976609e39f789ca09f Mon Sep 17 00:00:00 2001 From: mstate Date: Mon, 18 Mar 2024 09:13:19 -0400 Subject: [PATCH 5/5] Update readme.md --- readme.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/readme.md b/readme.md index a38524fa..18c17e15 100644 --- a/readme.md +++ b/readme.md @@ -270,19 +270,19 @@ api_endpoint = Async::HTTP::Endpoint.parse(api_url, ssl_context: ssl_context) auth_endpoint = Async::HTTP::Endpoint.parse(auth_url, ssl_context: ssl_context) clients = { - api_url => Async::HTTP::Client.new(api_endpoint), + api_url => Async::HTTP::Client.new(api_endpoint), auth_url => Async::HTTP::Client.new(auth_endpoint) } Async do - internet = Async::HTTP::Internet.new(clients: clients) - token_response = internet.get("#{internet}/auth/token") - token = JSON.parse(token_response.read).dig("token") - headers = [['Authorization', "Bearer #{token}"]] - widgets_response = internet.get("#{api_url}/widgets", headers ) + internet = Async::HTTP::Internet.new(clients: clients) + token_response = internet.get("#{internet}/auth/token") + token = JSON.parse(token_response.read).dig("token") + headers = [['Authorization', "Bearer #{token}"]] + widgets_response = internet.get("#{api_url}/widgets", headers ) - pp widgets_response.status, widgets_response.headers.fields, widgets_response.read + pp widgets_response.status, widgets_response.headers.fields, widgets_response.read end ```