#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'ritm' require 'json' require 'cert' require_relative 'database' require_relative 'context' module Doraemon class ProxyServer attr_accessor :scene_id def initialize(port=7000, scene_id) @port = port @scene_id = scene_id @mutex = Mutex.new end def start() Cert.generate_cert puts "Proxy server start, port: #{@port}, scene_id: #{@scene_id}" _session = Ritm::Session.new _port = @port _session.configure do ssl_reverse_proxy.ca[:pem] = Cert.cert_path ssl_reverse_proxy.ca[:key] = Cert.key_path ssl_reverse_proxy[:bind_port] = _port + 10000; proxy[:bind_address] = '0.0.0.0' proxy[:bind_port] = _port end _session.on_response do |_req, _resp| # NOTE: 这里每次回调会在单独线程进行 next unless _req.request_uri.host.end_with?('idongjia.cn') _params = begin JSON.parse(_req.body) rescue _req.body end _result = begin JSON.parse(_resp.body) rescue {} end if @scene_id > 0 _path = _req.path DB.query_api_contents(@scene_id, _path) do |api| if !api.nil? _resp_body = nil begin _result = eval(api['contents']) _resp_body = _result.to_json rescue Exception => e puts "Exception rescue: #{e.full_message(order: :top)}" _result = { "code": -1, "msg": "#{_path} 处理错误: #{e.to_s}" } _resp_body = _result.to_json end _resp.status = 200 _resp.body = _resp_body _resp.header['content-length'] = _resp.body.bytesize _resp.header['content-type'] = 'application/json; charset=utf-8' puts "-----------------------------------------------------------------" puts " - PATH: #{_req.request_uri}" puts " - Request: #{_params.to_json}" puts " - Response: #{_resp_body}" end end end end _session.start trap 'INT' do _session.shutdown return end loop { gets } end end end