Added example.
This commit is contained in:
@@ -0,0 +1,248 @@
|
||||
class ServiceConverter
|
||||
|
||||
@@convert_timeout = Rails.configuration.timeout
|
||||
@@document_converter_url = Rails.configuration.urlConverter
|
||||
@@document_storage_url = Rails.configuration.urlStorage
|
||||
@@convert_params = '?url=%s&outputtype=%s&filetype=%s&title=%s&key=%s&vkey=%s'
|
||||
@@max_try = 3
|
||||
|
||||
class << self
|
||||
|
||||
def get_converted_uri(document_uri, from_ext, to_ext, document_revision_id, is_async)
|
||||
converted_document_uri = nil
|
||||
responce_from_convert_service = send_request_to_convert_service(document_uri, from_ext, to_ext, document_revision_id, is_async)
|
||||
|
||||
file_result = responce_from_convert_service['FileResult']
|
||||
|
||||
error_element = file_result['Error']
|
||||
if error_element != nil
|
||||
process_convert_service_responce_error(error_element.to_i)
|
||||
end
|
||||
|
||||
is_end_convert = file_result['EndConvert'].downcase == 'true'
|
||||
percent = file_result['Percent'].to_i
|
||||
|
||||
if is_end_convert
|
||||
converted_document_uri = file_result['FileUrl']
|
||||
percent = 100
|
||||
else
|
||||
percent = percent >= 100 ? 99 : percent;
|
||||
end
|
||||
|
||||
return percent, converted_document_uri
|
||||
end
|
||||
|
||||
def get_external_uri(content, content_length, content_type, document_revision_id)
|
||||
|
||||
validate_key = generate_validate_key(document_revision_id, nil)
|
||||
|
||||
url_to_storage = @@document_storage_url + (@@convert_params % ['', '', '', '', document_revision_id, validate_key])
|
||||
|
||||
if content_type == nil
|
||||
content_type = 'application/octet-stream'
|
||||
end
|
||||
|
||||
uri = URI.parse(url_to_storage)
|
||||
http = Net::HTTP.new(uri.host, uri.port)
|
||||
|
||||
if url_to_storage.start_with?('https')
|
||||
http.use_ssl = true
|
||||
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||
end
|
||||
|
||||
req = Net::HTTP::Post.new(uri.request_uri, {'Content-Type' => content_type , 'Content-Length' => content_length.to_s })
|
||||
req.body = content
|
||||
res = http.request(req)
|
||||
data = res.body
|
||||
|
||||
if data == nil
|
||||
raise 'Could not get an answer'
|
||||
end
|
||||
|
||||
document_response = Hash.from_xml(data.gsub('\n', ''))
|
||||
percent, external_uri = get_response_uri(document_response)
|
||||
|
||||
external_uri
|
||||
|
||||
end
|
||||
|
||||
def generate_revision_id(expected_key)
|
||||
|
||||
require 'zlib'
|
||||
|
||||
if expected_key.length > 20
|
||||
expected_key = (Zlib.crc32 expected_key).to_s
|
||||
end
|
||||
|
||||
key = expected_key.gsub(/[^0-9a-zA-Z.=]/, '_')
|
||||
key[(key.length - [key.length, 20].min)..key.length]
|
||||
|
||||
end
|
||||
|
||||
def generate_validate_key(document_revision_id, user_ip)
|
||||
|
||||
if document_revision_id == nil
|
||||
return ''
|
||||
end
|
||||
|
||||
expire = Time.now.to_i * 1000
|
||||
key = generate_revision_id(document_revision_id)
|
||||
key_id = get_key
|
||||
user_count = '0'
|
||||
ip = user_ip != nil ? '' : user_ip
|
||||
|
||||
key = '{"expire": "\/Date(%s)\/", "key" : "%s", "key_id" : "%s", "user_count" : %s, "ip" : "%s"}' %
|
||||
[expire.to_s, key.to_s, key_id.to_s, user_count, ip]
|
||||
|
||||
Signature.create(key, get_skey)
|
||||
|
||||
end
|
||||
|
||||
def get_key
|
||||
|
||||
Rails.configuration.tenantId
|
||||
|
||||
end
|
||||
|
||||
def get_skey
|
||||
|
||||
Rails.configuration.key
|
||||
|
||||
end
|
||||
|
||||
def send_request_to_convert_service(document_uri, from_ext, to_ext, document_revision_id, is_async)
|
||||
|
||||
from_ext = from_ext == nil ? File.extname(document_uri) : from_ext
|
||||
|
||||
title = File.basename(URI.parse(document_uri).path)
|
||||
title = title == nil ? UUID.generate.to_s : title
|
||||
|
||||
document_revision_id = document_revision_id.empty? ? document_uri : document_revision_id
|
||||
document_revision_id = generate_revision_id(document_revision_id)
|
||||
|
||||
validate_key = generate_validate_key(document_revision_id, nil)
|
||||
|
||||
url_to_converter = @@document_converter_url +
|
||||
(@@convert_params % [URI::encode(document_uri), to_ext.delete('.'), from_ext.delete('.'), title, document_revision_id, validate_key])
|
||||
|
||||
if is_async
|
||||
url_to_converter += '&async=true'
|
||||
end
|
||||
|
||||
data = nil
|
||||
count_try = 0
|
||||
|
||||
while count_try < @@max_try
|
||||
begin
|
||||
count_try += 1
|
||||
|
||||
uri = URI.parse(url_to_converter)
|
||||
http = Net::HTTP.new(uri.host, uri.port)
|
||||
|
||||
if url_to_converter.start_with?('https')
|
||||
http.use_ssl = true
|
||||
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||
end
|
||||
|
||||
http.read_timeout = @@convert_timeout
|
||||
req = Net::HTTP::Get.new(uri.request_uri)
|
||||
res = http.request(req)
|
||||
data = res.body
|
||||
|
||||
break
|
||||
rescue TimeoutError
|
||||
#try again
|
||||
rescue => ex
|
||||
raise ex.message
|
||||
end
|
||||
end
|
||||
|
||||
if count_try == @@max_try && data == nil
|
||||
raise 'timeout'
|
||||
end
|
||||
|
||||
Hash.from_xml(data.gsub('\n', ''))
|
||||
|
||||
end
|
||||
|
||||
def process_convert_service_responce_error(error_code)
|
||||
|
||||
error_message = 'unknown error'
|
||||
|
||||
case error_code
|
||||
when -8
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error document VKey'
|
||||
when -7
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error document request'
|
||||
when -6
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error database'
|
||||
when -5
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error unexpected guid'
|
||||
when -4
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error download error'
|
||||
when -3
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error convertation error'
|
||||
when -2
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error convertation timeout'
|
||||
when -1
|
||||
error_message = 'Error occurred in the ConvertService.ashx: Error convertation unknown'
|
||||
when 0
|
||||
#public const int c_nErrorNo = 0
|
||||
else
|
||||
error_message = 'ErrorCode = ' + error_code.to_s
|
||||
end
|
||||
|
||||
raise error_message
|
||||
|
||||
end
|
||||
|
||||
def get_response_uri(document_response)
|
||||
|
||||
file_result = document_response['FileResult']
|
||||
if file_result == nil
|
||||
raise 'Invalid answer format'
|
||||
end
|
||||
|
||||
error_element = file_result['Error']
|
||||
if error_element != nil
|
||||
process_convert_service_responce_error(error_element.to_i)
|
||||
end
|
||||
|
||||
end_convert_element = file_result['EndConvert']
|
||||
if end_convert_element == nil
|
||||
raise 'Invalid answer format'
|
||||
end
|
||||
is_end_convert = end_convert_element.downcase == 'true'
|
||||
|
||||
result_percent = 0
|
||||
response_uri = ''
|
||||
|
||||
if is_end_convert
|
||||
|
||||
file_url_element = file_result['FileUrl']
|
||||
|
||||
if file_url_element == nil
|
||||
raise 'Invalid answer format'
|
||||
end
|
||||
|
||||
response_uri = file_url_element
|
||||
result_percent = 100
|
||||
|
||||
else
|
||||
|
||||
percent_element = file_result['Percent']
|
||||
|
||||
if percent_element != nil
|
||||
result_percent = percent_element.to_i
|
||||
end
|
||||
|
||||
result_percent = result_percent >= 100 ? 99 : result_percent
|
||||
|
||||
end
|
||||
|
||||
return result_percent, response_uri
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user