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.8 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: unxf-public@bogomips.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 576172018D; Thu, 17 Mar 2016 23:47:06 +0000 (UTC) From: Eric Wong To: unxf-public@bogomips.org Cc: Eric Wong Subject: [PATCH] remove optimizations which only made sense in old Rubies Date: Thu, 17 Mar 2016 23:47:05 +0000 Message-Id: <1458258425-13347-1-git-send-email-e@80x24.org> List-Id: Constants waste memory and inline cache lookups are not free, either. Rely on frozen string literals in Ruby 2.3+, but continue optimizing for opt_str_freeze in Ruby 2.1+ when literal strings are explicitly frozen. --- lib/unxf.rb | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/lib/unxf.rb b/lib/unxf.rb index cf1f5e9..1f6a066 100644 --- a/lib/unxf.rb +++ b/lib/unxf.rb @@ -1,19 +1,10 @@ # -*- encoding: binary -*- +# -*- frozen_string_literal: true -*- require 'rpatricia' # Rack middleware to remove "HTTP_X_FORWARDED_FOR" in the Rack environment and # replace "REMOTE_ADDR" with the value of the original client address. class UnXF - # :stopdoc: - # reduce garbage overhead by using constant strings - REMOTE_ADDR = "REMOTE_ADDR".freeze - HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR" - HTTP_X_FORWARDED_PROTO = "HTTP_X_FORWARDED_PROTO" - RACK_URL_SCHEME = "rack.url_scheme".freeze - UNXF_FOR = "unxf.for".freeze - UNXF_PROTO = "unxf.proto".freeze - HTTPS = "https" - # :startdoc: # local LAN addresses described in RFC 1918 RFC_1918 = %w(10.0.0.0/8 172.16.0.0/12 192.168.0.0/16) @@ -58,10 +49,10 @@ class UnXF # This allows existing applications to use UnXF without putting it # into the middleware stack (to avoid increasing stack depth and GC time) def unxf!(env) - if xff_str = env.delete(HTTP_X_FORWARDED_FOR) - env[UNXF_FOR] = xff_str + if xff_str = env.delete('HTTP_X_FORWARDED_FOR'.freeze) + env['unxf.for'] = xff_str xff = xff_str.split(/\s*,\s*/) - addr = env[REMOTE_ADDR] + addr = env['REMOTE_ADDR'] begin while (/:/ =~ addr ? @trusted6 : @trusted).include?(addr) && tmp = xff.pop @@ -74,10 +65,10 @@ class UnXF # it's stupid to have https at any point other than the first # proxy in the chain, so we don't support that if xff.empty? - env[REMOTE_ADDR] = addr - if xfp = env.delete(HTTP_X_FORWARDED_PROTO) - env[UNXF_PROTO] = xfp - /\Ahttps\b/ =~ xfp and env[RACK_URL_SCHEME] = HTTPS + env['REMOTE_ADDR'] = addr + if xfp = env.delete('HTTP_X_FORWARDED_PROTO'.freeze) + env['unxf.proto'] = xfp + /\Ahttps\b/ =~ xfp and env['rack.url_scheme'] = 'https'.freeze end else return on_untrusted_addr(env, xff_str) -- EW