# class Veritrans::Tercerog::Mdk::MdkConnectionServlet

MdkConnectionServlet クラス

    サーブレット接続クラス

### Public Class Methods

new(use_default_conf = true) click to toggle source

### コンストラクタ¶ ↑

コンフィグファイルからデータを取得して当クラスを使用できる状態にする。 パラメータuse_default_confがFALSEの場合はデフォルト値を設定しない。

@param

  use_default_conf デフォルトのConfigファイルからデータを取得するかを指定するフラグ

    # File tgMdk/lib/tg_mdk/mdk_connection_servlet.rb, line 28
    def initialize(use_default_conf = true)

      # プロキシを使用するかを示すフラグ
      @use_proxy = false
      # プロキシのホスト
      @proxy_host = nil
      # プロキシのポート
      @proxy_port = nil
      # プロキシのユーザ
      @proxy_username = nil
      # プロキシのユーザのパスワード
      @proxy_password = nil

      # 接続タイムアウト
      @connection_timeout = 0
      # 読み取りタイムアウト
      @read_timeout = 0

      # 公開鍵ファイルパス
      @ca_cert_file = nil

      # SSLプロトコル
      @ssl_protocol = nil

      # コンフィグクラスのインスタンス設定
      @config = Veritrans::Tercerog::Mdk::MdkConfig.instance

      # デフォルト値を設定
      set_default_config if use_default_conf
    end

### Public Instance Methods

execute(url_str, param) click to toggle source

### Servlet接続メソッド¶ ↑

@param

  url_str 接続先URL

@param

  param 送信するパラメータ

@return

  処理結果

    # File tgMdk/lib/tg_mdk/mdk_connection_servlet.rb, line 92
    def execute(url_str, param)

      # 接続先URLを解析
      url = URI.parse(url_str)
      # HTTPインスタンスを生成
      http = new_http_instance(url)

      header = {
        "Content-Type" => "application/json",
        "User-Agent" => @config.get_user_agent
      }

      # POST送信
      rtn_str = ""
      http.start {|w|
        response = w.post(url.path, param, header)

        # 応答電文のHTTPステータスチェック
        http_result_checker(response.code)

        # 応答電文設定
        rtn_str = response.body
      }

      unless rtn_str.nil?
        rtn_str.force_encoding(Veritrans::Tercerog::Mdk::MdkUtils::DFAULT_ENCODE)
      end
      return rtn_str

    rescue OpenSSL::SSL::SSLError => e
      raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MB03_SSLSOCKET_CREATION_FAILED
    rescue Timeout::Error => e
      raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MF03_SERVER_TIME_OUT
    rescue Net::HTTPServerException => e
      raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MF99_SYSTEM_INTERNAL_ERROR
    end

### Private Instance Methods

http_result_checker(result_code) click to toggle source

### HTTPステータスを判断して例外を発生させ¶ ↑

@param

  result_code HTTPステータス

    # File tgMdk/lib/tg_mdk/mdk_connection_servlet.rb, line 162
    def http_result_checker(result_code)
      # nilチェック
      if result_code.nil?
        raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MF02_CANNOT_CONNECT_TO_GW
      end

      case result_code
      when "200"
        # 正常終了  以下、異常終了
      when "500"
        raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MF05_INTERNAL_SERVER_ERROR
      when "502"
        raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MF06_BAD_GW
      when "503"
        raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MF07_SERVICE_UNAVAILABLE
      else
        raise Veritrans::Tercerog::Mdk::MdkError, Veritrans::Tercerog::Mdk::MdkMessage::MF02_CANNOT_CONNECT_TO_GW
      end
    end

new_http_instance(url) click to toggle source

### HTTPインスタンスを生成する。¶ ↑

@param

  url URLオブジェクト

@return

  HTTPインスタンス

    # File tgMdk/lib/tg_mdk/mdk_connection_servlet.rb, line 134
    def new_http_instance(url)

      if @use_proxy
        # Proxyを使用する場合
        proxy_checker(url.host, url.port)
        http = Net::HTTP::Proxy(@proxy_host, @proxy_port, @proxy_username, @proxy_password)                          .new(url.host, url.port)
      else
        http = Net::HTTP.new(url.host, url.port)
      end

      http.use_ssl = true
      if !@ca_cert_file.nil? && !@ca_cert_file.empty?
        http.ca_file = @ca_cert_file
      end
      http.ssl_version = @ssl_protocol
      http.verify_mode = OpenSSL::SSL::VERIFY_PEER
      http.open_timeout = @connection_timeout
      http.read_timeout = @read_timeout

      return http
    end

proxy_checker(host, port) click to toggle source

### PROXYサーバ接続確認¶ ↑

@param

  host 接続先HOST

@param

  port 接続先PORT

    # File tgMdk/lib/tg_mdk/mdk_connection_servlet.rb, line 188
    def proxy_checker(host, port)
      sock = nil
      Timeout::timeout(@connection_timeout) {
        sock = TCPSocket.open(@proxy_host, @proxy_port)
      }
      auth = [ [@proxy_username, @proxy_password].join(':') ].pack('m')
      req = []
      req << "CONNECT #{host}:#{port} HTTP/1.0"
      req << "Host: #{host}:#{port}"
      req << "Proxy-Authorization: basic #{auth}"
      req << ""

      sock.write(req.join("\r\n"))

      sock_res = nil;
      Timeout::timeout(@read_timeout) {
        sock_res = sock.gets
      }
      sock.close
      res_code = sock_res.match(/^HTTP\/1\.. (\d+)/).to_a[1]
      if res_code != nil && res_code.size > 0
        if res_code != "200"
          raise Veritrans::Tercerog::Mdk::MdkError.new(Veritrans::Tercerog::Mdk::MdkMessage::MF01_PROXY_ERROR, sock_res.chomp)
        end
      end
    end

set_default_config() click to toggle source

### 当クラスをConfigファイルを使用して値を設定する¶ ↑

    # File tgMdk/lib/tg_mdk/mdk_connection_servlet.rb, line 62
    def set_default_config()

      # Proxy情報設定
      if @config[:PROXY_SERVER_URL] and
          @config[:PROXY_SERVER_URL].strip.length > 0
        proxy_url = URI.parse(@config[:PROXY_SERVER_URL])
        @proxy_host = proxy_url.host
        @proxy_port = proxy_url.port
        @proxy_username = @config[:PROXY_USERNAME]
        @proxy_password = @config[:PROXY_PASSWORD]
        @use_proxy = true
      end

      # 接続タイムアウト設定
      @connection_timeout = @config[:CONNECTION_TIMEOUT].to_f
      # 読み取りタイムアウト設定
      @read_timeout = @config[:READ_TIMEOUT].to_f
      # 公開鍵ファイルパス設定
      @ca_cert_file = @config[:CA_CERT_FILE]
      # SSLプロトコル
      @ssl_protocol = @config[:SSL_PROTOCOL]
    end