Sha256: 958204f5ffb42a378b4236423b9e82c17e011c2304b607deab2e2445bd4dab61

Contents?: true

Size: 1.76 KB

Versions: 1

Compression:

Stored size: 1.76 KB

Contents

require "tunnels/version"
require "eventmachine"

# most of code is from [thin-glazed](https://github.com/freelancing-god/thin-glazed).
# Copyright © 2012, Thin::Glazed was a Rails Camp New Zealand project, and is developed and maintained by Pat Allan. It is released under the open MIT Licence.

module Tunnels
  def self.run!(host = '127.0.0.1', from = 443, to = 80)
    EventMachine.run do
      EventMachine.start_server(host, from, HttpsProxy, to)
      puts "Ready :)"
    end
  rescue => e
    puts e.message
    puts "Maybe you should run on `sudo`"
  end

  class HttpClient < EventMachine::Connection
    attr_reader :proxy

    def initialize(proxy)
      @proxy     = proxy
      @connected = EventMachine::DefaultDeferrable.new
    end

    def connection_completed
      @connected.succeed
    end

    def receive_data(data)
      proxy.relay_from_client(data)
    end

    def send(data)
      @connected.callback { send_data data }
    end

    def unbind
      proxy.unbind_client
    end
  end

  class HttpProxy < EventMachine::Connection
    attr_reader :client_port

    def initialize(client_port)
      @client_port = client_port
    end

    def receive_data(data)
      client.send_data data unless data.nil?
    end

    def relay_from_client(data)
      send_data data unless data.nil?
    end

    def unbind
      client.close_connection
      @client = nil
    end

    def unbind_client
      close_connection_after_writing
      @client = nil
    end

    private

    def client
      @client ||= EventMachine.connect '127.0.0.1', client_port, HttpClient, self
    end
  end

  class HttpsProxy < HttpProxy
    def post_init
      start_tls
    end

    def receive_data(data)
      super data.gsub(/\r\n\r\n/, "\r\nX_FORWARDED_PROTO: https\r\n\r\n")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
tunnels-1.0.0 lib/tunnels.rb