summaryrefslogtreecommitdiff
path: root/lib/httpunix.rb
blob: 7d00f71d55bfc2def88f244e6a807e5e8cd5f785 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# support for http+unix://... connection scheme
#
# The URI scheme has the same structure as the similar one for python requests. See:
#   http://fixall.online/theres-no-need-to-reinvent-the-wheelhttpsgithubcommsabramorequests-unixsocketurl/241810/
#   https://github.com/msabramo/requests-unixsocket

require 'uri'
require 'net/http'

module URI
  class HTTPUNIX < HTTP
    def hostname
      # decode %XX from path to file
      v = host
      URI.decode(v)
    end

    # port is not allowed in URI
    DEFAULT_PORT = nil
    def set_port(v)
      return v unless v
      raise InvalidURIError, "http+unix:// cannot contain port"
    end
  end
  @@schemes['HTTP+UNIX'] = HTTPUNIX
end

# Based on:
# - http://stackoverflow.com/questions/15637226/ruby-1-9-3-simple-get-request-to-unicorn-through-socket
# - Net::HTTP::connect
module Net
  class HTTPUNIX < HTTP
    def initialize(socketpath, port = nil)
      super(socketpath, port)
      @port = nil # HTTP will set it to default - override back -> set DEFAULT_PORT
    end

    # override to prevent ":<port>" being appended to HTTP_HOST
    def addr_port
      address
    end

    def connect
      D "opening connection to #{address} ..."
      s = UNIXSocket.new(address)
      D "opened"
      @socket = BufferedIO.new(s)
      @socket.read_timeout = @read_timeout
      @socket.continue_timeout = @continue_timeout
      @socket.debug_output = @debug_output
      on_connect
    end
  end
end