class Pdfcrowd::ConnectionHelper

Public Class Methods

new(user_name, api_key) click to toggle source
# File lib/pdfcrowd.rb, line 536
def initialize(user_name, api_key)
    @user_name = user_name
    @api_key = api_key

    reset_response_data()

    setProxy(nil, nil, nil, nil)
    setUseHttp(false)
    setUserAgent('pdfcrowd_ruby_client/5.2.0 (https://pdfcrowd.com)')

    @retry_count = 1
    @converter_version = '20.10'
end

Private Class Methods

add_file_field(name, file_name, data, body) click to toggle source
# File lib/pdfcrowd.rb, line 624
def self.add_file_field(name, file_name, data, body)
    body << '--' + MULTIPART_BOUNDARY
    body << 'Content-Disposition: form-data; name="%s"; filename="%s"' % [name, file_name]
    body << 'Content-Type: application/octet-stream'
    body << ''
    body << data.force_encoding('UTF-8')
end
encode_multipart_post_data(fields, files, raw_data) click to toggle source
# File lib/pdfcrowd.rb, line 632
def self.encode_multipart_post_data(fields, files, raw_data)
    body = []
    for field, value in fields
        body << '--' + MULTIPART_BOUNDARY << 'Content-Disposition: form-data; name="%s"' % field << '' << value.to_s if value
    end
    for name, file_name in files
        File.open(file_name, 'rb') do |f|
            ConnectionHelper.add_file_field(name, file_name, f.read, body)
        end
    end
    for name, data in raw_data
        ConnectionHelper.add_file_field(name, name, data, body)
    end
    # finalize
    body << '--' + MULTIPART_BOUNDARY + '--'
    body << ''
    body.join("\r\n")
end

Public Instance Methods

getConsumedCreditCount() click to toggle source
# File lib/pdfcrowd.rb, line 588
def getConsumedCreditCount()
    @consumed_credits
end
getConverterVersion() click to toggle source
# File lib/pdfcrowd.rb, line 604
def getConverterVersion()
    @converter_version
end
getDebugLogUrl() click to toggle source
# File lib/pdfcrowd.rb, line 580
def getDebugLogUrl()
    @debug_log_url
end
getJobId() click to toggle source
# File lib/pdfcrowd.rb, line 592
def getJobId()
    @job_id
end
getOutputSize() click to toggle source
# File lib/pdfcrowd.rb, line 600
def getOutputSize()
    @output_size
end
getPageCount() click to toggle source
# File lib/pdfcrowd.rb, line 596
def getPageCount()
    @page_count
end
getRemainingCreditCount() click to toggle source
# File lib/pdfcrowd.rb, line 584
def getRemainingCreditCount()
    @credits
end
post(fields, files, raw_data, out_stream = nil) click to toggle source
# File lib/pdfcrowd.rb, line 550
def post(fields, files, raw_data, out_stream = nil)
    request = create_request()
    request.body = ConnectionHelper.encode_multipart_post_data(fields, files, raw_data)
    request.content_type = 'multipart/form-data; boundary=' + MULTIPART_BOUNDARY
    do_post(request, out_stream)
end
setConverterVersion(converter_version) click to toggle source
# File lib/pdfcrowd.rb, line 569
def setConverterVersion(converter_version)
    @converter_version = converter_version
end
setProxy(host, port, user_name, password) click to toggle source
# File lib/pdfcrowd.rb, line 573
def setProxy(host, port, user_name, password)
    @proxy_host = host
    @proxy_port = port
    @proxy_user_name = user_name
    @proxy_password = password
end
setRetryCount(retry_count) click to toggle source
# File lib/pdfcrowd.rb, line 565
def setRetryCount(retry_count)
    @retry_count = retry_count
end
setUseHttp(use_http) click to toggle source
# File lib/pdfcrowd.rb, line 557
def setUseHttp(use_http)
    @use_http = use_http
end
setUserAgent(user_agent) click to toggle source
# File lib/pdfcrowd.rb, line 561
def setUserAgent(user_agent)
    @user_agent = user_agent
end

Private Instance Methods

create_http_obj() click to toggle source
# File lib/pdfcrowd.rb, line 651
def create_http_obj()
    if !@use_http
        require 'net/https' #apt-get install libopenssl-ruby
        http = Net::HTTP.new(HOST, 443)
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless HOST == 'api.pdfcrowd.com'
        http.use_ssl = true
    elsif @proxy_host
        http = Net::HTTP.new(HOST, 80, @proxy_host, @proxy_port, @proxy_user_name, @proxy_password)
    else
        http = Net::HTTP.new(HOST, 80)
    end

    return http
end
create_request() click to toggle source
# File lib/pdfcrowd.rb, line 620
def create_request()
    Net::HTTP::Post.new('/convert/%s/' % @converter_version)
end
do_post(request, out_stream) click to toggle source

sends a POST to the API

# File lib/pdfcrowd.rb, line 667
def do_post(request, out_stream)
    raise Error.new("HTTPS over a proxy is not supported.") if !@use_http and @proxy_host

    reset_response_data()

    request.basic_auth(@user_name, @api_key)
    request.add_field('User-Agent', @user_agent)

    while true
        begin
            return exec_request(request, out_stream)
        rescue Error => err
            if err.getCode() == '502' and @retry_count > @retry
                @retry += 1
                sleep(@retry * 0.1)
            else
                raise
            end
        end
    end
end
exec_request(request, out_stream) click to toggle source
# File lib/pdfcrowd.rb, line 689
def exec_request(request, out_stream)
    begin
        http = create_http_obj()

        begin
            http.start {|conn|
                conn.read_timeout = 300
                conn.request(request) {|response|
                    @debug_log_url = response["X-Pdfcrowd-Debug-Log"] || ''
                    @credits = (response["X-Pdfcrowd-Remaining-Credits"] || 999999).to_i
                    @consumed_credits = (response["X-Pdfcrowd-Consumed-Credits"] || 0).to_i
                    @job_id = response["X-Pdfcrowd-Job-Id"] || ''
                    @page_count = (response["X-Pdfcrowd-Pages"] || 0).to_i
                    @output_size = (response["X-Pdfcrowd-Output-Size"] || 0).to_i

                    raise Error.new('test 502', '502') \
                               if ENV["PDFCROWD_UNIT_TEST_MODE"] and
                                 @retry_count > @retry

                    case response
                    when Net::HTTPSuccess
                        if out_stream
                            response.read_body do |chunk|
                                out_stream.write(chunk)
                            end
                        else
                            return response.body
                        end
                    else
                        raise Error.new(response.body, response.code)
                    end
                }
            }
        rescue SystemCallError => why
            raise Error.new("#{why}\n")
        rescue Timeout::Error => why
            raise Error.new("Operation timed out\n")
        rescue OpenSSL::SSL::SSLError => why
            raise Error.new("There was a problem connecting to Pdfcrowd servers over HTTPS:\n#{why}" +
                            "\nYou can still use the API over HTTP, you just need to add the following line right after Pdfcrowd client initialization:\nself.setUseHttp(true)",
                            481)
        end
    end
end
reset_response_data() click to toggle source
# File lib/pdfcrowd.rb, line 610
def reset_response_data()
    @debug_log_url = nil
    @credits = 999999
    @consumed_credits = 0
    @job_id = ''
    @page_count = 0
    @output_size = 0
    @retry = 0
end