Method: OpenC3::HttpServerInterface#connect

Defined in:
lib/openc3/interfaces/http_server_interface.rb

#connectObject

Connects the interface to its target(s)



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/openc3/interfaces/http_server_interface.rb', line 51

def connect
  @server = WEBrick::HTTPServer.new(:BindAddress => @listen_address, :Port => @port)
  @request_queue = Queue.new

  # Create a response hook for every command packet
  @target_names.each do |target_name|
    System.commands.packets(target_name).each do |packet_name, packet|
      packet.restore_defaults
      path = nil
      begin
        path = packet.read('HTTP_PATH')
      rescue => e
        # No HTTP_PATH is an error
        Logger.error("HttpServerInterface Packet #{target_name} #{packet_name} unable to read HTTP_PATH\n#{e.formatted}")
      end
      if path
        @server.mount_proc path do |req, res|
          # Build the Response
          begin
            status = packet.read('HTTP_STATUS')
            if status
              res.status = status
            end
          rescue
            # No HTTP_STATUS - Leave at default
          end

          if packet.extra
            headers = packet.extra['HTTP_HEADERS']
            if headers
              headers.each do |key, value|
                res[key] = value
              end
            end
          end

          res.body = packet.buffer

          # Save the Request
          packet_name = nil
          begin
            packet_name = packet.read('HTTP_PACKET')
          rescue
            # No packet name means dont save the request as telemetry
          end
          if packet_name
            data = req.body.to_s.dup # Dup to remove frozen
            extra = {}
            extra['HTTP_REQUEST_TARGET_NAME'] = target_name
            extra['HTTP_REQUEST_PACKET_NAME'] = packet_name

            headers = req.header
            if headers
              extra['HTTP_HEADERS'] = {}
              headers.each do |key, value|
                extra['HTTP_HEADERS'][key.downcase] = value
              end
            end

            queries = req.query
            if queries
              extra['HTTP_QUERIES'] = {}
              queries.each do |key, value|
                extra['HTTP_QUERIES'][key] = value
              end
            end

            @request_queue << [data, extra]
          end
        end
      end
    end
  end

  super()

  Thread.new do
    # This blocks, but will be unblocked by server.shutdown called in disconnect()
    @server.start
  end
end