class ChupaText::Decomposers::HTTPServer

Public Class Methods

default_url() click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 30
def default_url
  @@default_url
end
default_url=(url) click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 34
def default_url=(url)
  @@default_url = url
end
new(options) click to toggle source
Calls superclass method ChupaText::Decomposer::new
# File lib/chupa-text/decomposers/http-server.rb, line 39
def initialize(options)
  super
  @url = @options[:url]
  @url = URI(@url) if @url
end

Public Instance Methods

decompose(data, &block) click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 58
def decompose(data, &block)
  url = @url || default_url
  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true if url.is_a?(URI::HTTPS)
  if data.timeout.is_a?(Numeric)
    timeout = data.timeout * 0.9
    http.open_timeout = timeout
    http.read_timeout = timeout
    http.write_timeout = timeout if http.respond_to?(:write_timeout=)
    http.continue_timeout = timeout
  end
  begin
    http.start do
      process_request(url, http, data, &block)
    end
  rescue SystemCallError => error
    error do
      message = "#{log_tag}[connection] "
      message << "Failed to process data in server: "
      message << "#{url}: "
      message << "#{error.class}: #{error.message}\n"
      message << error.backtrace.join("\n")
      message
    end
  rescue Net::ReadTimeout => error
    error do
      message = "#{log_tag}[timeout] "
      message << "Failed to process data in server: "
      message << "#{url}: "
      message << "#{error.class}: #{error.message}\n"
      message << error.backtrace.join("\n")
      message
    end
  end
end
target?(data) click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 45
def target?(data)
  return false if data.text_plain?
  @url or default_url
end
target_score(data) click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 50
def target_score(data)
  if target?(data)
    -100
  else
    nil
  end
end

Private Instance Methods

build_parameters(data, input) click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 137
def build_parameters(data, input)
  parameters = []
  [
    ["timeout",
     data.timeout || ChupaText::ExternalCommand.default_timeout],
    ["limit_cpu",
     data.limit_cpu || ChupaText::ExternalCommand.default_limit_cpu],
    ["limit_as",
     data.limit_as || ChupaText::ExternalCommand.default_limit_as],
    ["max_body_size", data.max_body_size],
    ["need_screenshot", data.need_screenshot?],
  ].each do |key, value|
    next if value.nil?
    parameters << [key, StringIO.new(value.to_s)]
  end
  parameters << [
    "data",
    input,
    {
      filename: data.path.to_s,
      content_type: data.mime_type,
    },
  ]
  parameters
end
default_url() click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 95
def default_url
  url = self.class.default_url || ENV["CHUPA_TEXT_HTTP_SERVER_URL"]
  return nil if url.nil?
  URI(url)
end
log_tag() click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 163
def log_tag
  "[decomposer][http-server]"
end
process_request(url, http, data) { |text_data| ... } click to toggle source
# File lib/chupa-text/decomposers/http-server.rb, line 101
def process_request(url, http, data)
  request = Net::HTTP::Post.new(url)
  request["transfer-encoding"] = "chunked"
  request["expect"] = "100-continue" if http.continue_timeout
  data.open do |input|
    request.set_form(build_parameters(data, input),
                     "multipart/form-data")
    response = http.request(request)
    case response
    when Net::HTTPOK
      extracted = JSON.parse(response.body)
      (extracted["texts"] || []).each do |text|
        text_data = TextData.new(text["body"], source_data: data)
        text.each do |key, value|
          next if key == "body"
          text_data[key] = value
        end
        yield(text_data)
      end
    else
      error do
        message = "#{log_tag} Failed to process data in server: "
        message << "<#{data.uri}>(#{data.mime_type}): #{url}: "
        message << "#{response.code}: #{response.message.strip}\n"
        case response.content_type
        when "application/json"
          PP.pp(JSON.parse(response.body), message)
        else
          message << response.body
        end
        message
      end
    end
  end
end