elibri_watermarking 0.7.4.1 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,3 +2,4 @@ source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in elibri_watermarking_client.gemspec
4
4
  gemspec
5
+ gem 'net-dns'
@@ -5,8 +5,8 @@ require "elibri_watermarking/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "elibri_watermarking"
7
7
  s.version = ElibriWatermarking::VERSION
8
- s.authors = ["Piotr Szmielew"]
9
- s.email = ["p.szmielew@ava.waw.pl"]
8
+ s.authors = ["Piotr Szmielew", "Tomasz Meka"]
9
+ s.email = ["p.szmielew@ava.waw.pl", "tomek@elibri.com.pl"]
10
10
  s.homepage = "http://elibri.com.pl"
11
11
  s.summary = %q{Gem designed to help in use of Elibri watermarking API.}
12
12
  s.description = %q{Gem designed to help in use of Elibri watermarking API.}
@@ -20,5 +20,5 @@ Gem::Specification.new do |s|
20
20
 
21
21
  # specify any dependencies here; for example:
22
22
  s.add_development_dependency "rake"
23
- # s.add_runtime_dependency "rest-client"
23
+ s.add_runtime_dependency "net-dns"
24
24
  end
@@ -1,5 +1,6 @@
1
1
  require 'net/http'
2
2
  require 'net/https'
3
+ require 'net/dns'
3
4
  require 'uri'
4
5
  require 'digest/md5'
5
6
  require 'base64'
@@ -10,151 +11,97 @@ require 'json'
10
11
  module ElibriWatermarking
11
12
  class Client
12
13
 
13
- attr_accessor :token, :secret, :url
14
+ attr_accessor :token, :secret, :logger
14
15
 
15
- def initialize(token, secret, url='https://elibri.com.pl/watermarking')
16
+ def initialize(token, secret)
16
17
  self.token = token
17
18
  self.secret = secret
18
- self.url = url
19
19
  end
20
20
 
21
- def watermark(ident, formats, visible_watermark, title_postfix, args={})
22
- supplier = args[:supplier]
23
- client_symbol = args[:client_symbol]
24
- customer_ip = args[:customer_ip]
25
- ssl = args[:ssl]
26
- ssl = true if ssl.nil?
21
+ def watermark(ident, formats, visible_watermark, title_postfix, customer_ip, client_symbol = nil, supplier = nil)
27
22
  ident =~ /^[0-9]+$/ ? ident_type = 'isbn' : ident_type = 'record_reference'
28
23
  raise WrongFormats.new if formats.is_a?(String) && !formats =~ /^(epub|mobi|pdf|,)+$/
29
24
  raise WrongFormats.new if formats.is_a?(Array) && ((formats - ['epub','mobi','pdf']) != [] || (formats & ['epub','mobi','pdf']).count < 1)
30
- uri = URI(self.url + '/watermark')
31
25
  formats = formats.join(",") if formats.is_a?(Array)
32
- timestamp = Time.now.to_i
33
- sig = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp.to_s, self.secret)).strip)
34
26
  data = {ident_type => ident, 'formats' => formats, 'visible_watermark' => visible_watermark,
35
- 'title_postfix' => title_postfix, 'stamp' => timestamp, 'sig' => sig, 'token' => self.token,
36
- 'client_symbol' => client_symbol}
37
- if supplier
38
- data.merge!(:supplier => supplier)
39
- end
40
- if customer_ip
41
- data.merge!(:customer_ip => customer_ip)
42
- end
43
- req = Net::HTTP::Post.new(uri.path)
44
- req.set_form_data(data)
45
- http = Net::HTTP.new(uri.host, uri.port)
46
- if ssl
47
- http.use_ssl = true
48
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
49
- end
50
- res = http.start {|http| http.request(req) }
51
- return validate_response(res)
27
+ 'title_postfix' => title_postfix, 'client_symbol' => client_symbol}
28
+ data.merge!(:supplier => supplier) if supplier
29
+ data.merge!(:customer_ip => customer_ip) if customer_ip
30
+
31
+ try_with_different_servers('watermark') do |uri|
32
+ return get_response_from_server(uri, data, Net::HTTP::Post)
33
+ end
52
34
  end
53
-
54
- def deliver(trans_id, ssl=true)
55
- uri = URI(self.url + '/deliver')
56
- timestamp = Time.now.to_i
57
- sig = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp.to_s, self.secret)).strip)
58
- data = {'stamp' => timestamp, 'sig' => sig, 'token' => self.token, 'trans_id' => trans_id}
59
- req = Net::HTTP::Post.new(uri.path)
60
- req.set_form_data(data)
61
- http = Net::HTTP.new(uri.host, uri.port)
62
- if ssl
63
- http.use_ssl = true
64
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
35
+
36
+ def deliver(trans_id)
37
+ try_with_different_servers('deliver') do |uri|
38
+ return get_response_from_server(uri, {'trans_id' => trans_id}, Net::HTTP::Post)
65
39
  end
66
- res = http.start {|http| http.request(req) }
67
- return validate_response(res)
68
40
  end
69
-
70
- def retry(trans_id, ssl=true)
71
- uri = URI(self.url + '/retry')
72
- timestamp = Time.now.to_i
73
- sig = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp.to_s, self.secret)).strip)
74
- data = {'stamp' => timestamp, 'sig' => sig, 'token' => self.token, 'trans_id' => trans_id}
75
- req = Net::HTTP::Post.new(uri.path)
76
- req.set_form_data(data)
77
- http = Net::HTTP.new(uri.host, uri.port)
78
- if ssl
79
- http.use_ssl = true
80
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
41
+
42
+ def retry(trans_id)
43
+ try_with_different_servers('retry') do |uri|
44
+ return get_response_from_server(uri, {'trans_id' => trans_id}, Net::HTTP::Post)
81
45
  end
82
- res = http.start {|http| http.request(req) }
83
- return validate_response(res)
84
46
  end
85
-
86
- def available_files(ssl=true)
87
- uri = URI(self.url + '/available_files.json')
88
- timestamp = Time.now.to_i
89
- sig = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp.to_s, self.secret)).strip)
90
- data = {'stamp' => timestamp, 'sig' => sig, 'token' => self.token}
91
- req = Net::HTTP::Get.new(uri.path)
92
- req.set_form_data(data)
93
- http = Net::HTTP.new(uri.host, uri.port)
94
- if ssl
95
- http.use_ssl = true
96
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
47
+
48
+ def available_files
49
+ try_with_different_servers('available_files.json') do |uri|
50
+ return JSON.parse(get_response_from_server(uri, {}, Net::HTTP::Get))
97
51
  end
98
- res = http.start {|http| http.request(req) }
99
- return JSON.parse(validate_response(res))
100
52
  end
101
-
102
- def soon_available_files(ssl=true)
103
- uri = URI(self.url + '/soon_available_files.json')
104
- timestamp = Time.now.to_i
105
- sig = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp.to_s, self.secret)).strip)
106
- data = {'stamp' => timestamp, 'sig' => sig, 'token' => self.token}
107
- req = Net::HTTP::Get.new(uri.path)
108
- req.set_form_data(data)
109
- http = Net::HTTP.new(uri.host, uri.port)
110
- if ssl
111
- http.use_ssl = true
112
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
53
+
54
+ def soon_available_files
55
+ try_with_different_servers('soon_available_files.json') do |uri|
56
+ return JSON.parse(get_response_from_server(uri, {}, Net::HTTP::Get))
113
57
  end
114
- res = http.start {|http| http.request(req) }
115
- return JSON.parse(validate_response(res))
116
58
  end
117
-
118
- def check_suppliers(ident, ssl=true)
59
+
60
+ def check_suppliers(ident)
119
61
  ident =~ /^[0-9]+$/ ? ident_type = 'isbn' : ident_type = 'record_reference'
120
- uri = URI(self.url + '/check_suppliers')
121
- timestamp = Time.now.to_i
122
- sig = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp.to_s, self.secret)).strip)
123
- data = {'stamp' => timestamp, 'sig' => sig, 'token' => self.token, ident_type => ident}
124
- req = Net::HTTP::Get.new(uri.path)
125
- req.set_form_data(data)
126
- http = Net::HTTP.new(uri.host, uri.port)
127
- if ssl
128
- http.use_ssl = true
129
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
62
+ try_with_different_servers('check_suppliers') do |uri|
63
+ return get_response_from_server(uri, { ident_type => ident}, Net::HTTP::Get).split(",").map { |x| x.to_i }
130
64
  end
131
- res = http.start {|http| http.request(req) }
132
- return validate_response(res).split(",").map { |x| x.to_i }
133
65
  end
134
-
135
- def get_supplier(id, ssl=true)
136
- uri = URI(self.url + '/get_supplier')
137
- timestamp = Time.now.to_i
138
- sig = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp.to_s, self.secret)).strip)
139
- data = {'stamp' => timestamp, 'sig' => sig, 'token' => self.token, 'id' => id}
140
- req = Net::HTTP::Get.new(uri.path)
66
+
67
+ def get_supplier(id)
68
+ try_with_different_servers('get_supplier') do |uri|
69
+ return get_response_from_server(uri, { 'id' => id }, Net::HTTP::Get)
70
+ end
71
+ end
72
+
73
+ protected
74
+
75
+ def get_response_from_server(uri, data, request_class)
76
+ logger.info("doing #{uri}") if logger
77
+ timestamp = Time.now.to_i.to_s
78
+ data.merge!({'stamp' => timestamp, 'sig' => CGI.escape(Base64.encode64(OpenSSL::HMAC.digest('sha1', timestamp, self.secret)).strip), 'token' => self.token})
79
+ req = request_class.new(uri.path)
141
80
  req.set_form_data(data)
142
81
  http = Net::HTTP.new(uri.host, uri.port)
143
- if ssl
144
- http.use_ssl = true
145
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
146
- end
82
+ http.use_ssl = true
83
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
147
84
  res = http.start {|http| http.request(req) }
148
85
  return validate_response(res)
149
86
  end
150
-
151
- def watermark_and_deliver(ident, formats, visible_watermark, title_postfix, args={})
152
- trans_id = watermark(ident, formats, visible_watermark, title_postfix, args)
153
- return trans_id if deliver(trans_id) == "OK"
87
+
88
+ def try_with_different_servers(action)
89
+ txt_record = Net::DNS::Resolver.start("transactional-servers.elibri.com.pl", Net::DNS::TXT).answer.first.txt
90
+ servers = txt_record.split(",").sort_by(&:rand).map(&:strip)
91
+ servers.each do |server|
92
+ uri = URI("https://#{server}.elibri.com.pl/watermarking/#{action}")
93
+ logger.info("trying #{uri}") if logger
94
+ begin
95
+ yield uri
96
+ rescue Timeout::Error, SystemCallError
97
+ logger.error($!) if logger
98
+ rescue ServerException
99
+ logger.error($!) if logger
100
+ end
101
+ end
102
+ raise NoWorkingServer.new("none of the servers #{servers.map { |s| "#{s}.elibri.com.pl" }.join(', ')} seems to work now")
154
103
  end
155
-
156
- protected
157
-
104
+
158
105
  def validate_response(res)
159
106
  case res.class.to_s
160
107
  when "Net::HTTPBadRequest"
@@ -20,6 +20,8 @@ module ElibriWatermarking
20
20
 
21
21
  class RequestExpired < ElibriException
22
22
  end
23
+
24
+ class NoWorkingServer < ElibriException
25
+ end
23
26
 
24
-
25
- end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module ElibriWatermarking
2
- VERSION = "0.7.4.1"
2
+ VERSION = "0.8"
3
3
  end
metadata CHANGED
@@ -1,22 +1,22 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elibri_watermarking
3
3
  version: !ruby/object:Gem::Version
4
- hash: 101
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 7
9
- - 4
10
- - 1
11
- version: 0.7.4.1
8
+ - 8
9
+ version: "0.8"
12
10
  platform: ruby
13
11
  authors:
14
12
  - Piotr Szmielew
13
+ - Tomasz Meka
15
14
  autorequire:
16
15
  bindir: bin
17
16
  cert_chain: []
18
17
 
19
- date: 2012-10-16 00:00:00 Z
18
+ date: 2012-11-03 00:00:00 +01:00
19
+ default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: rake
@@ -32,9 +32,24 @@ dependencies:
32
32
  version: "0"
33
33
  type: :development
34
34
  version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: net-dns
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
35
49
  description: Gem designed to help in use of Elibri watermarking API.
36
50
  email:
37
51
  - p.szmielew@ava.waw.pl
52
+ - tomek@elibri.com.pl
38
53
  executables: []
39
54
 
40
55
  extensions: []
@@ -51,6 +66,7 @@ files:
51
66
  - lib/elibri_watermarking/client.rb
52
67
  - lib/elibri_watermarking/exceptions.rb
53
68
  - lib/elibri_watermarking/version.rb
69
+ has_rdoc: true
54
70
  homepage: http://elibri.com.pl
55
71
  licenses: []
56
72
 
@@ -80,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
96
  requirements: []
81
97
 
82
98
  rubyforge_project: elibri_watermarking
83
- rubygems_version: 1.8.21
99
+ rubygems_version: 1.5.2
84
100
  signing_key:
85
101
  specification_version: 3
86
102
  summary: Gem designed to help in use of Elibri watermarking API.