Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Patch HTTPClient to accept socket_connect_timeout #3174

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 23 additions & 21 deletions lib/diego/client.rb
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
require 'diego/bbs/bbs'
require 'diego/errors'
require 'diego/routes'
require 'http/httpclient'

module Diego
class Client
PROTOBUF_HEADER = { 'Content-Type'.freeze => 'application/x-protobuf'.freeze }.freeze

def initialize(url:, ca_cert_file:, client_cert_file:, client_key_file:,
connect_timeout:, send_timeout:, receive_timeout:)
connect_timeout:, send_timeout:, receive_timeout:)
ENV['PB_IGNORE_DEPRECATIONS'] ||= 'true'
@client = build_client(
url,
Expand All @@ -24,7 +25,7 @@ def ping
client.post(Routes::PING)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::PingResponse)
end

Expand All @@ -35,7 +36,7 @@ def upsert_domain(domain:, ttl:)
client.post(Routes::UPSERT_DOMAIN, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::UpsertDomainResponse)
end

Expand All @@ -46,7 +47,7 @@ def desire_task(task_definition:, domain:, task_guid:)
client.post(Routes::DESIRE_TASK, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::TaskLifecycleResponse)
end

Expand All @@ -57,7 +58,7 @@ def task_by_guid(task_guid)
client.post(Routes::TASK_BY_GUID, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::TaskResponse)
end

Expand All @@ -68,7 +69,7 @@ def tasks(domain: '', cell_id: '')
client.post(Routes::LIST_TASKS, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::TasksResponse)
end

Expand All @@ -79,7 +80,7 @@ def cancel_task(task_guid)
client.post(Routes::CANCEL_TASK, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::TaskLifecycleResponse)
end

Expand All @@ -90,7 +91,7 @@ def desire_lrp(lrp)
client.post(Routes::DESIRE_LRP, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::DesiredLRPLifecycleResponse)
end

Expand All @@ -101,7 +102,7 @@ def desired_lrp_by_process_guid(process_guid)
client.post(Routes::DESIRED_LRP_BY_PROCESS_GUID, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::DesiredLRPResponse)
end

Expand All @@ -112,7 +113,7 @@ def update_desired_lrp(process_guid, lrp_update)
client.post(Routes::UPDATE_DESIRED_LRP, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::DesiredLRPLifecycleResponse)
end

Expand All @@ -123,7 +124,7 @@ def remove_desired_lrp(process_guid)
client.post(Routes::REMOVE_DESIRED_LRP, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::DesiredLRPLifecycleResponse)
end

Expand All @@ -134,7 +135,7 @@ def retire_actual_lrp(actual_lrp_key)
client.post(Routes::RETIRE_ACTUAL_LRP, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::ActualLRPLifecycleResponse)
end

Expand All @@ -145,7 +146,7 @@ def desired_lrp_scheduling_infos(domain)
client.post(Routes::DESIRED_LRP_SCHEDULING_INFOS, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::DesiredLRPSchedulingInfosResponse)
end

Expand All @@ -156,7 +157,7 @@ def actual_lrps_by_process_guid(process_guid)
client.post(Routes::ACTUAL_LRPS, request, PROTOBUF_HEADER)
end

validate_status!(response: response, statuses: [200])
validate_status_200!(response)
protobuf_decode!(response.body, Bbs::Models::ActualLRPsResponse)
end

Expand All @@ -180,8 +181,8 @@ def protobuf_encode!(hash, protobuf_message_class)
raise EncodeError.new(e.message)
end

def validate_status!(response:, statuses:)
raise ResponseError.new("failed with status: #{response.status}, body: #{response.body}") unless statuses.include?(response.status)
def validate_status_200!(response)
raise ResponseError.new("failed with status: #{response.status}, body: #{response.body}") unless response.status == 200
end

def protobuf_decode!(message, protobuf_decoder)
Expand All @@ -191,11 +192,12 @@ def protobuf_decode!(message, protobuf_decoder)
end

def build_client(url, ca_cert_file, client_cert_file, client_key_file,
connect_timeout, send_timeout, receive_timeout)
client = HTTPClient.new(base_url: url)
client.connect_timeout = connect_timeout
client.send_timeout = send_timeout
client.receive_timeout = receive_timeout
connect_timeout, send_timeout, receive_timeout)
client = HTTPClient.new(base_url: url)
client.socket_connect_timeout = connect_timeout / 2
client.connect_timeout = connect_timeout
client.send_timeout = send_timeout
client.receive_timeout = receive_timeout
client.ssl_config.set_client_cert_file(client_cert_file, client_key_file)
client.ssl_config.set_trust_ca(ca_cert_file)
client
Expand Down
41 changes: 41 additions & 0 deletions lib/http/httpclient.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
require 'httpclient'

module HTTPClientMonkeyPatch
module SocketConnectTimeout
attr_reader :socket_connect_timeout

def socket_connect_timeout=(timeout)
@socket_connect_timeout = timeout
end
end

module TCPSocketWithConnectTimeout
def create_socket(host, port)
@debug_dev << "! CONNECT TO #{host}:#{port}\n" if @debug_dev
clean_host = host.delete('[]')
if @socket_local == HTTPClient::Site::EMPTY
socket = TCPSocket.new(clean_host, port, connect_timeout: @client.socket_connect_timeout)
else
clean_local = @socket_local.host.delete('[]')
socket = TCPSocket.new(clean_host, port, clean_local, @socket_local.port, connect_timeout: @client.socket_connect_timeout)
end
socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true) if @tcp_keepalive
if @debug_dev
@debug_dev << "! CONNECTION ESTABLISHED\n"
socket.extend(HTTPClient::DebugSocket)
socket.debug_dev = @debug_dev
end
socket
rescue SystemCallError, SocketError => e
raise e.new(e.message + " (#{host}:#{port})")
end
end
end

class HTTPClient
prepend HTTPClientMonkeyPatch::SocketConnectTimeout
end

class HTTPClient::Session
prepend HTTPClientMonkeyPatch::TCPSocketWithConnectTimeout
end
Loading