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