From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, T_RP_MATCHES_RCVD shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: yahns-public@yhbt.net Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id EDC301FABD for ; Sat, 9 May 2015 01:05:46 +0000 (UTC) From: Eric Wong To: yahns-public@yhbt.net Subject: [PATCH] avoid excess allocations for rack.hijack support Date: Sat, 9 May 2015 01:05:46 +0000 Message-Id: <1431133546-30847-1-git-send-email-e@80x24.org> List-Id: Proc object allocation is not cheap, so avoid doing it and allow Yahns::HttpClient to be assigned as the env["rack.hijack"] callback for Rack applications. --- lib/yahns/http_client.rb | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/yahns/http_client.rb b/lib/yahns/http_client.rb index 164cac9..a0fd5a4 100644 --- a/lib/yahns/http_client.rb +++ b/lib/yahns/http_client.rb @@ -208,7 +208,7 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: # check_client_connection if input env[REMOTE_ADDR] = @kgio_addr - env[RACK_HIJACK] = hijack_proc(env) + env[RACK_HIJACK] = self env[RACK_INPUT] = input if k.check_client_connection && @hs.headers? @@ -228,14 +228,6 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: http_response_write(status, headers, body) end - # this is the env["rack.hijack"] callback exposed to the Rack app - def hijack_proc(env) - proc do - hijack_cleanup - env[RACK_HIJACK_IO] = self - end - end - # called automatically by kgio_write def kgio_wait_writable(timeout = self.class.client_timeout) super timeout @@ -268,6 +260,12 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc: @input = nil # keep env["rack.input"] accessible, though end + # this is the env["rack.hijack"] callback exposed to the Rack app + def call + hijack_cleanup + @hs.env[RACK_HIJACK_IO] = self + end + def response_hijacked(fn) hijack_cleanup fn.call(self) -- EW