t2-server 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.rdoc +17 -0
- data/README.rdoc +32 -13
- data/bin/t2-run-workflow +10 -7
- data/bin/t2-server-info +4 -4
- data/lib/t2-server.rb +2 -0
- data/lib/t2-server/admin.rb +17 -15
- data/lib/t2-server/exceptions.rb +10 -0
- data/lib/t2-server/net/connection.rb +60 -120
- data/lib/t2-server/net/parameters.rb +4 -0
- data/lib/t2-server/port.rb +3 -3
- data/lib/t2-server/run.rb +125 -151
- data/lib/t2-server/server.rb +130 -161
- data/lib/t2-server/util.rb +39 -0
- data/t2-server.gemspec +1 -1
- data/test/tc_admin.rb +5 -2
- data/test/tc_run.rb +11 -0
- data/test/tc_server.rb +2 -2
- data/test/tc_util.rb +44 -0
- data/test/ts_t2server.rb +1 -0
- data/test/workflows/no-ports.t2flow +76 -0
- data/version.yml +1 -1
- metadata +3 -2
data/CHANGES.rdoc
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
= Changes log for the T2 Ruby Gem
|
2
2
|
|
3
|
+
== Version 0.9.2
|
4
|
+
|
5
|
+
* Cleanup of the README and some delete additions.
|
6
|
+
* Complete documentation coverage.
|
7
|
+
* Update the parsing of the server version.
|
8
|
+
* Optimize Server object creation.
|
9
|
+
* Add URI manipulating methods to T2Server::Util.
|
10
|
+
* Internal updates to use full URIs rather than relative paths.
|
11
|
+
* Updates to the administrator interface to use full URIs.
|
12
|
+
* URI code updates for secure workflow and permissions support.
|
13
|
+
* Remove (deprecate) Server#delete_run.
|
14
|
+
* Support direct PUT of data for newer versions of server.
|
15
|
+
* Update the documentation of the Connection classes.
|
16
|
+
* Minor updates to the top-level README.
|
17
|
+
* Cleanup of t2-server-info script.
|
18
|
+
* t2-run-workflow: Only print outputs if there are any.
|
19
|
+
|
3
20
|
== Version 0.9.1
|
4
21
|
|
5
22
|
* Update unit test code for Ruby 1.9 compatibility.
|
data/README.rdoc
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
= Taverna[http://www.taverna.org.uk/] 2 Server Interaction Gem
|
2
2
|
|
3
3
|
Authors:: Robert Haines
|
4
|
-
Contact:: mailto:
|
4
|
+
Contact:: mailto:support@mygrid.org.uk
|
5
5
|
URL:: http://www.taverna.org.uk/
|
6
6
|
Licence:: BSD (See LICENCE or http://www.opensource.org/licenses/bsd-license.php)
|
7
7
|
Copyright:: (c) 2010-2012 The University of Manchester, UK
|
@@ -37,8 +37,8 @@ This version of the library should be compatible with any Ruby code that you
|
|
37
37
|
may have already written against earlier versions but you may see some warnings
|
38
38
|
about API deprecations. These are clearly marked [DEPRECATION] and will appear
|
39
39
|
on your console output. Anything marked as deprecated will be removed in
|
40
|
-
version 1.0.0
|
41
|
-
convenience.
|
40
|
+
version 1.0.0 (and are not guaranteed to continue working even until then) so
|
41
|
+
you are advised to update your code at your earliest convenience.
|
42
42
|
|
43
43
|
== Compatibility with Ruby versions
|
44
44
|
|
@@ -49,7 +49,7 @@ This library is known to work with the following versions of Ruby:
|
|
49
49
|
* jruby 1.6.4 (in Ruby 1.8 mode)
|
50
50
|
|
51
51
|
Those marked with an asterisk (*) are supported and bugs found against them
|
52
|
-
will be fixed. Other versions may work but are not supported.
|
52
|
+
will be fixed. Other versions may work but are not tested or supported.
|
53
53
|
|
54
54
|
== Usage
|
55
55
|
|
@@ -60,7 +60,7 @@ There are two entry points for the T2Server API:
|
|
60
60
|
|
61
61
|
In both cases the gem should be initialized by requiring the top level ruby
|
62
62
|
file:
|
63
|
-
require 't2-server
|
63
|
+
require 't2-server'
|
64
64
|
|
65
65
|
=== Configuring a Server connection
|
66
66
|
|
@@ -71,11 +71,11 @@ connection.
|
|
71
71
|
|
72
72
|
Connection configuration settings are passed in to various methods using the
|
73
73
|
+ConnectionParameters+ class. Parameters that can be set are:
|
74
|
-
* <tt>:ca_file</tt>
|
75
|
-
* <tt>:ca_path</tt>
|
76
|
-
* <tt>:verify_peer</tt>
|
77
|
-
* <tt>:client_certificate</tt>
|
78
|
-
* <tt>:client_password</tt>
|
74
|
+
* <tt>:ca_file</tt> - A file to use as a Certificate Authority (CA) for self-signed server certificates.
|
75
|
+
* <tt>:ca_path</tt> - Path or list of paths to directories of CA certificates.
|
76
|
+
* <tt>:verify_peer</tt> - Use a CA to verify that the Taverna Server you are connecting to has a valid server certificate and that it is the correct one.
|
77
|
+
* <tt>:client_certificate</tt> - A certificate to use for client certificate authentication.
|
78
|
+
* <tt>:client_password</tt> - The password to unlock the private key of the client certificate.
|
79
79
|
|
80
80
|
And can be set like this for a standard https connection:
|
81
81
|
|
@@ -83,7 +83,7 @@ And can be set like this for a standard https connection:
|
|
83
83
|
conn_params[:verify_peer] = true
|
84
84
|
|
85
85
|
This will ensure that the identity of the Taverna Server you are connecting to
|
86
|
-
will be verified using the set of certificates
|
86
|
+
will be verified using the default set of certificates for your platform.
|
87
87
|
<tt>:ca_path</tt> can also be set to a list of paths if required. You do not
|
88
88
|
need to include your platform's default certificate paths as these are included
|
89
89
|
automatically.
|
@@ -117,6 +117,21 @@ Note that credentials are not required by default to simply connect to a
|
|
117
117
|
Taverna Server. Further operations (such as creating and starting runs) may
|
118
118
|
require authorization depending on how your server has been set up.
|
119
119
|
|
120
|
+
To create a Run on a Server simply pass the workflow you wish to run and your
|
121
|
+
credentials:
|
122
|
+
|
123
|
+
server.create_run(workflow, credentials) do |run|
|
124
|
+
...
|
125
|
+
end
|
126
|
+
|
127
|
+
An individual run can be deleted with its own <tt>delete</tt> method (see below)
|
128
|
+
but all runs on a server can be deleted in one go:
|
129
|
+
|
130
|
+
server.delete_all_runs(credentials)
|
131
|
+
|
132
|
+
Note that you can only delete runs for which your credentials have delete
|
133
|
+
authorization. See later for details.
|
134
|
+
|
120
135
|
=== Run API example
|
121
136
|
|
122
137
|
You can bypass the Server API if you know you are only going to be dealing with
|
@@ -169,6 +184,10 @@ But make sure you request baclava output *before* starting the run:
|
|
169
184
|
run.wait
|
170
185
|
output = run.baclava_output
|
171
186
|
|
187
|
+
A run can be deleted when no longer needed, like so:
|
188
|
+
|
189
|
+
run.delete
|
190
|
+
|
172
191
|
See the rdoc for more information. Many methods and classes have much more
|
173
192
|
functionality than the defaults described above. Please note that anything
|
174
193
|
which does not appear in the documentation is not intended to be part of the
|
@@ -239,9 +258,9 @@ WSDL address of the service with your username and password:
|
|
239
258
|
|
240
259
|
==== R Servers (via Rshells)
|
241
260
|
|
242
|
-
You can authenticate to R Servers in almost exactly the same as for
|
261
|
+
You can authenticate to R Servers in almost exactly the same way as for
|
243
262
|
REST services - only the protocol scheme is different. So instead of
|
244
|
-
http or https it is rserve
|
263
|
+
+http+ or +https+ it is +rserve+:
|
245
264
|
|
246
265
|
run.add_password_credential("rserve://example.com:6311", "username", "password")
|
247
266
|
|
data/bin/t2-run-workflow
CHANGED
@@ -175,13 +175,16 @@ begin
|
|
175
175
|
puts "Zip file written to '#{options[:zip_out]}'"
|
176
176
|
else
|
177
177
|
# go through the outputs and print them out
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
178
|
+
outputs = run.output_ports
|
179
|
+
unless outputs.empty?
|
180
|
+
puts "Outputs:"
|
181
|
+
outputs.each_value do |port|
|
182
|
+
print " #{port.name} (#{port.depth}) -> "
|
183
|
+
if options[:output_refs]
|
184
|
+
p port.reference
|
185
|
+
else
|
186
|
+
p port.value
|
187
|
+
end
|
185
188
|
end
|
186
189
|
end
|
187
190
|
end
|
data/bin/t2-server-info
CHANGED
@@ -56,11 +56,11 @@ uri, creds = parse_address(ARGV.shift, creds)
|
|
56
56
|
# connect to server and output information
|
57
57
|
begin
|
58
58
|
T2Server::Server.new(uri, conn_params) do |server|
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
puts " Server: #{server.uri}"
|
60
|
+
puts " Version: #{server.version}"
|
61
|
+
puts " Run limit: #{server.run_limit(creds)}"
|
62
62
|
runs = server.runs(creds)
|
63
|
-
|
63
|
+
puts "No. of runs: #{runs.length}"
|
64
64
|
if options[:list] && runs.length > 0
|
65
65
|
puts (Hirb::Helpers::ObjectTable.render runs,
|
66
66
|
:fields=>[:identifier, :status, :expiry],
|
data/lib/t2-server.rb
CHANGED
@@ -49,6 +49,8 @@ require 't2-server/admin'
|
|
49
49
|
# * T2Server::Server - Use this if you are providing a web interface to a
|
50
50
|
# Taverna 2 Server instance.
|
51
51
|
module T2Server
|
52
|
+
|
53
|
+
# Library version information.
|
52
54
|
module Version
|
53
55
|
# Version information in a Hash
|
54
56
|
INFO = YAML.load_file(File.join(File.dirname(__FILE__), "..",
|
data/lib/t2-server/admin.rb
CHANGED
@@ -46,11 +46,14 @@ module T2Server
|
|
46
46
|
attr_reader :resources
|
47
47
|
|
48
48
|
# :stopdoc:
|
49
|
+
ADMIN_ENDPOINT = "admin"
|
50
|
+
|
49
51
|
def initialize(server, credentials = nil)
|
50
52
|
@server = server
|
53
|
+
@uri = Util.append_to_uri_path(server.uri, ADMIN_ENDPOINT)
|
51
54
|
@credentials = credentials
|
52
55
|
|
53
|
-
admin_description = xml_document(@server.
|
56
|
+
admin_description = xml_document(@server.read(@uri, "application/xml",
|
54
57
|
@credentials))
|
55
58
|
@resources = get_resources(admin_description)
|
56
59
|
#@resources.each {|key, value| puts "#{key}: #{value}"}
|
@@ -68,12 +71,12 @@ module T2Server
|
|
68
71
|
end
|
69
72
|
|
70
73
|
# :stopdoc:
|
71
|
-
def get_resource_value(
|
72
|
-
@server.
|
74
|
+
def get_resource_value(uri)
|
75
|
+
@server.read(uri, "text/plain", @credentials)
|
73
76
|
end
|
74
77
|
|
75
|
-
def set_resource_value(
|
76
|
-
@server.
|
78
|
+
def set_resource_value(uri, val)
|
79
|
+
@server.update(uri, val.to_s, "text/plain", @credentials)
|
77
80
|
end
|
78
81
|
# :startdoc:
|
79
82
|
|
@@ -82,10 +85,9 @@ module T2Server
|
|
82
85
|
links = {}
|
83
86
|
|
84
87
|
xml_children(doc.root) do |res|
|
85
|
-
|
86
|
-
write = @server.
|
87
|
-
links[res.name.downcase] = AdminResource.new(res.name,
|
88
|
-
write, self)
|
88
|
+
uri = URI.parse(xml_node_attribute(res, 'href'))
|
89
|
+
write = @server.is_resource_writable?(uri, @credentials)
|
90
|
+
links[res.name.downcase] = AdminResource.new(res.name, uri, write, self)
|
89
91
|
end
|
90
92
|
|
91
93
|
links
|
@@ -100,13 +102,13 @@ module T2Server
|
|
100
102
|
# The name of this resource.
|
101
103
|
attr_reader :name
|
102
104
|
|
103
|
-
# The
|
104
|
-
attr_reader :
|
105
|
+
# The URI of this resource on the server.
|
106
|
+
attr_reader :uri
|
105
107
|
|
106
108
|
# :stopdoc:
|
107
|
-
def initialize(name,
|
109
|
+
def initialize(name, uri, writeable, parent)
|
108
110
|
@name = name
|
109
|
-
@
|
111
|
+
@uri = uri
|
110
112
|
@admin = parent
|
111
113
|
@writeable = writeable
|
112
114
|
|
@@ -123,7 +125,7 @@ module T2Server
|
|
123
125
|
#
|
124
126
|
# The resource can only be set if it is writable.
|
125
127
|
def value
|
126
|
-
@admin.get_resource_value(@
|
128
|
+
@admin.get_resource_value(@uri)
|
127
129
|
end
|
128
130
|
|
129
131
|
# :call-seq:
|
@@ -138,7 +140,7 @@ module T2Server
|
|
138
140
|
def make_writable
|
139
141
|
(class << self; self; end).instance_eval do
|
140
142
|
define_method "value=" do |value|
|
141
|
-
@admin.set_resource_value(@
|
143
|
+
@admin.set_resource_value(@uri, value)
|
142
144
|
end
|
143
145
|
end
|
144
146
|
end
|
data/lib/t2-server/exceptions.rb
CHANGED
@@ -66,6 +66,8 @@ module T2Server
|
|
66
66
|
# way. This could be due to the server not accepting the connection, the
|
67
67
|
# connection being dropped unexpectedly or a timeout of some sort.
|
68
68
|
class ConnectionError < T2ServerError
|
69
|
+
|
70
|
+
# The internal cause of this connection error.
|
69
71
|
attr_reader :cause
|
70
72
|
|
71
73
|
# Create a new ConnectionError with the specified cause. The cause to be
|
@@ -94,6 +96,8 @@ module T2Server
|
|
94
96
|
# expectation is that the run exists then it could have been destroyed by
|
95
97
|
# a timeout or another user.
|
96
98
|
class RunNotFoundError < T2ServerError
|
99
|
+
|
100
|
+
# The identifier of the run that was not found on the server.
|
97
101
|
attr_reader :identifier
|
98
102
|
|
99
103
|
# Create a new RunNotFoundError with the specified identifier.
|
@@ -106,6 +110,8 @@ module T2Server
|
|
106
110
|
# Indicates that the attribute that the user is trying to read/change does
|
107
111
|
# not exist. The attribute could be a server or run attribute.
|
108
112
|
class AttributeNotFoundError < T2ServerError
|
113
|
+
|
114
|
+
# The path of the attribute that was not found on the server.
|
109
115
|
attr_reader :path
|
110
116
|
|
111
117
|
# Create a new AttributeNotFoundError with the path to the erroneous
|
@@ -128,6 +134,8 @@ module T2Server
|
|
128
134
|
# Access to the entity (run or attribute) is denied. The credentials
|
129
135
|
# supplied are not sufficient or the server does not allow the operation.
|
130
136
|
class AccessForbiddenError < T2ServerError
|
137
|
+
|
138
|
+
# The path of the attribute that the user is forbidden to access.
|
131
139
|
attr_reader :path
|
132
140
|
|
133
141
|
# Create a new AccessForbiddenError with the path to the restricted
|
@@ -142,6 +150,8 @@ module T2Server
|
|
142
150
|
|
143
151
|
# Access to the server is denied to this username
|
144
152
|
class AuthorizationError < T2ServerError
|
153
|
+
|
154
|
+
# The username that has failed authorization.
|
145
155
|
attr_reader :username
|
146
156
|
|
147
157
|
# Create a new AuthorizationError with the rejected username
|
@@ -98,84 +98,18 @@ module T2Server
|
|
98
98
|
end
|
99
99
|
|
100
100
|
# :call-seq:
|
101
|
-
#
|
101
|
+
# GET(uri, type, range, credentials) -> String
|
102
102
|
#
|
103
|
-
#
|
104
|
-
# The new run's identifier (in String form) is returned.
|
105
|
-
def POST_run(path, value, credentials)
|
106
|
-
response = _POST(path, value, "application/xml", credentials)
|
107
|
-
|
108
|
-
case response
|
109
|
-
when Net::HTTPCreated
|
110
|
-
# return the identifier of the newly created run
|
111
|
-
path_leaf_from_uri(response['location'])
|
112
|
-
when Net::HTTPForbidden
|
113
|
-
raise ServerAtCapacityError.new
|
114
|
-
when Net::HTTPUnauthorized
|
115
|
-
raise AuthorizationError.new(credentials)
|
116
|
-
else
|
117
|
-
raise UnexpectedServerResponse.new(response)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
# :call-seq:
|
122
|
-
# POST_file(path, value, run, credentials) -> bool
|
123
|
-
#
|
124
|
-
# Upload a file to a run. If successful, true is returned.
|
125
|
-
def POST_file(path, value, run, credentials)
|
126
|
-
response = _POST(path, value, "application/xml", credentials)
|
127
|
-
|
128
|
-
case response
|
129
|
-
when Net::HTTPCreated
|
130
|
-
# OK, carry on...
|
131
|
-
true
|
132
|
-
when Net::HTTPNotFound
|
133
|
-
raise RunNotFoundError.new(run)
|
134
|
-
when Net::HTTPForbidden
|
135
|
-
raise AccessForbiddenError.new("run #{run}")
|
136
|
-
when Net::HTTPUnauthorized
|
137
|
-
raise AuthorizationError.new(credentials)
|
138
|
-
else
|
139
|
-
raise UnexpectedServerResponse.new(response)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
# :call-seq:
|
144
|
-
# POST_dir(path, value, run, dir, credentials) -> bool
|
145
|
-
#
|
146
|
-
# Create a directory in the scratch space of a run. If successful, true
|
147
|
-
# is returned.
|
148
|
-
def POST_dir(path, value, run, dir, credentials)
|
149
|
-
response = _POST(path, value, "application/xml", credentials)
|
150
|
-
|
151
|
-
case response
|
152
|
-
when Net::HTTPCreated
|
153
|
-
# OK, carry on...
|
154
|
-
true
|
155
|
-
when Net::HTTPNotFound
|
156
|
-
raise RunNotFoundError.new(run)
|
157
|
-
when Net::HTTPForbidden
|
158
|
-
raise AccessForbiddenError.new("#{dir} on run #{run}")
|
159
|
-
when Net::HTTPUnauthorized
|
160
|
-
raise AuthorizationError.new(credentials)
|
161
|
-
else
|
162
|
-
raise UnexpectedServerResponse.new(response)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
# :call-seq:
|
167
|
-
# GET(path, type, range, credentials) -> String
|
168
|
-
#
|
169
|
-
# HTTP GET a resource at _path_ of _type_ from the server. If successful
|
103
|
+
# HTTP GET a resource at _uri_ of _type_ from the server. If successful
|
170
104
|
# the body of the response is returned. A portion of the data can be
|
171
105
|
# retrieved by specifying a byte range, start..end, with the _range_
|
172
106
|
# parameter.
|
173
|
-
def GET(
|
174
|
-
get = Net::HTTP::Get.new(path)
|
107
|
+
def GET(uri, type, range, credentials)
|
108
|
+
get = Net::HTTP::Get.new(uri.path)
|
175
109
|
get["Accept"] = type
|
176
110
|
get["Range"] = "bytes=#{range.min}-#{range.max}" unless range.nil?
|
177
111
|
|
178
|
-
response = submit(get,
|
112
|
+
response = submit(get, uri, credentials)
|
179
113
|
|
180
114
|
case response
|
181
115
|
when Net::HTTPOK, Net::HTTPPartialContent
|
@@ -186,9 +120,9 @@ module T2Server
|
|
186
120
|
new_conn = redirect(response["location"])
|
187
121
|
raise ConnectionRedirectError.new(new_conn)
|
188
122
|
when Net::HTTPNotFound
|
189
|
-
raise AttributeNotFoundError.new(path)
|
123
|
+
raise AttributeNotFoundError.new(uri.path)
|
190
124
|
when Net::HTTPForbidden
|
191
|
-
raise AccessForbiddenError.new("attribute #{path}")
|
125
|
+
raise AccessForbiddenError.new("attribute #{uri.path}")
|
192
126
|
when Net::HTTPUnauthorized
|
193
127
|
raise AuthorizationError.new(credentials)
|
194
128
|
else
|
@@ -197,25 +131,37 @@ module T2Server
|
|
197
131
|
end
|
198
132
|
|
199
133
|
# :call-seq:
|
200
|
-
# PUT(
|
134
|
+
# PUT(uri, value, type, credentials) -> bool
|
135
|
+
# PUT(uri, value, type, credentials) -> URI
|
201
136
|
#
|
202
|
-
# Perform a HTTP PUT of _value_ to a
|
203
|
-
#
|
204
|
-
|
205
|
-
|
137
|
+
# Perform a HTTP PUT of _value_ to a location on the server specified by
|
138
|
+
# _uri_ . If successful _true_ , or a URI to the PUT resource, is returned
|
139
|
+
# depending on whether the operation has set a parameter (true) or uploaded
|
140
|
+
# data (URI).
|
141
|
+
def PUT(uri, value, type, credentials)
|
142
|
+
put = Net::HTTP::Put.new(uri.path)
|
206
143
|
put.content_type = type
|
207
144
|
put.body = value
|
208
145
|
|
209
|
-
response = submit(put,
|
146
|
+
response = submit(put, uri, credentials)
|
210
147
|
|
211
148
|
case response
|
212
149
|
when Net::HTTPOK
|
213
|
-
#
|
150
|
+
# We've set a parameter so we get 200 back from the server. Return
|
151
|
+
# true to indicate success.
|
214
152
|
true
|
153
|
+
when Net::HTTPCreated
|
154
|
+
# We've uploaded data so we get 201 back from the server. Return the
|
155
|
+
# uri of the created resource.
|
156
|
+
URI.parse(response['location'])
|
157
|
+
when Net::HTTPNoContent
|
158
|
+
# We've modified data so we get 204 back from the server. Return the
|
159
|
+
# uri of the modified resource.
|
160
|
+
uri
|
215
161
|
when Net::HTTPNotFound
|
216
|
-
raise AttributeNotFoundError.new(path)
|
162
|
+
raise AttributeNotFoundError.new(uri.path)
|
217
163
|
when Net::HTTPForbidden
|
218
|
-
raise AccessForbiddenError.new("attribute #{path}")
|
164
|
+
raise AccessForbiddenError.new("attribute #{uri.path}")
|
219
165
|
when Net::HTTPUnauthorized
|
220
166
|
raise AuthorizationError.new(credentials)
|
221
167
|
else
|
@@ -224,21 +170,29 @@ module T2Server
|
|
224
170
|
end
|
225
171
|
|
226
172
|
# :call-seq:
|
227
|
-
# POST(
|
173
|
+
# POST(uri, value, type, credentials)
|
228
174
|
#
|
229
|
-
# Perform an HTTP POST of _value_ to a
|
230
|
-
#
|
231
|
-
def POST(
|
232
|
-
|
175
|
+
# Perform an HTTP POST of _value_ to a location on the server specified by
|
176
|
+
# _uri_ and return the URI of the created attribute.
|
177
|
+
def POST(uri, value, type, credentials)
|
178
|
+
post = Net::HTTP::Post.new(uri.path)
|
179
|
+
post.content_type = type
|
180
|
+
post.body = value
|
181
|
+
|
182
|
+
response = submit(post, uri, credentials)
|
233
183
|
|
234
184
|
case response
|
235
185
|
when Net::HTTPCreated
|
236
|
-
# return the
|
237
|
-
|
186
|
+
# return the URI of the newly created item
|
187
|
+
URI.parse(response['location'])
|
238
188
|
when Net::HTTPNotFound
|
239
|
-
raise AttributeNotFoundError.new(path)
|
189
|
+
raise AttributeNotFoundError.new(uri.path)
|
240
190
|
when Net::HTTPForbidden
|
241
|
-
|
191
|
+
if response.body.chomp.include? "server load exceeded"
|
192
|
+
raise ServerAtCapacityError.new
|
193
|
+
else
|
194
|
+
raise AccessForbiddenError.new("attribute #{uri.path}")
|
195
|
+
end
|
242
196
|
when Net::HTTPUnauthorized
|
243
197
|
raise AuthorizationError.new(credentials)
|
244
198
|
else
|
@@ -247,24 +201,23 @@ module T2Server
|
|
247
201
|
end
|
248
202
|
|
249
203
|
# :call-seq:
|
250
|
-
# DELETE(
|
204
|
+
# DELETE(uri, credentials) -> bool
|
251
205
|
#
|
252
|
-
# Perform an HTTP DELETE on a
|
206
|
+
# Perform an HTTP DELETE on a _uri_ on the server. If successful true
|
253
207
|
# is returned.
|
254
|
-
def DELETE(
|
255
|
-
|
256
|
-
delete = Net::HTTP::Delete.new(path)
|
208
|
+
def DELETE(uri, credentials)
|
209
|
+
delete = Net::HTTP::Delete.new(uri.path)
|
257
210
|
|
258
|
-
response = submit(delete,
|
211
|
+
response = submit(delete, uri, credentials)
|
259
212
|
|
260
213
|
case response
|
261
214
|
when Net::HTTPNoContent
|
262
215
|
# Success, carry on...
|
263
216
|
true
|
264
217
|
when Net::HTTPNotFound
|
265
|
-
|
218
|
+
false
|
266
219
|
when Net::HTTPForbidden
|
267
|
-
raise AccessForbiddenError.new(
|
220
|
+
raise AccessForbiddenError.new(uri)
|
268
221
|
when Net::HTTPUnauthorized
|
269
222
|
raise AuthorizationError.new(credentials)
|
270
223
|
else
|
@@ -273,20 +226,20 @@ module T2Server
|
|
273
226
|
end
|
274
227
|
|
275
228
|
# :call-seq:
|
276
|
-
# OPTIONS(
|
229
|
+
# OPTIONS(uri, credentials) -> Hash
|
277
230
|
#
|
278
|
-
# Perform the HTTP OPTIONS command on the given
|
231
|
+
# Perform the HTTP OPTIONS command on the given _uri_ and return a hash
|
279
232
|
# of the headers returned.
|
280
|
-
def OPTIONS(
|
281
|
-
options = Net::HTTP::Options.new(path)
|
233
|
+
def OPTIONS(uri, credentials)
|
234
|
+
options = Net::HTTP::Options.new(uri.path)
|
282
235
|
|
283
|
-
response = submit(options,
|
236
|
+
response = submit(options, uri, credentials)
|
284
237
|
|
285
238
|
case response
|
286
239
|
when Net::HTTPOK
|
287
240
|
response.to_hash
|
288
241
|
when Net::HTTPForbidden
|
289
|
-
raise AccessForbiddenError.new("resource #{path}")
|
242
|
+
raise AccessForbiddenError.new("resource #{uri.path}")
|
290
243
|
when Net::HTTPUnauthorized
|
291
244
|
raise AuthorizationError.new(credentials)
|
292
245
|
else
|
@@ -295,26 +248,13 @@ module T2Server
|
|
295
248
|
end
|
296
249
|
|
297
250
|
private
|
298
|
-
def _POST(path, value, type, credentials)
|
299
|
-
post = Net::HTTP::Post.new(path)
|
300
|
-
post.content_type = type
|
301
|
-
post.body = value
|
302
|
-
|
303
|
-
submit(post, path, credentials)
|
304
|
-
end
|
305
|
-
|
306
|
-
def path_leaf_from_uri(uri)
|
307
|
-
URI.parse(uri).path.split('/')[-1]
|
308
|
-
end
|
309
251
|
|
310
|
-
def submit(request,
|
311
|
-
full_uri = @uri.clone
|
312
|
-
full_uri.path = path
|
252
|
+
def submit(request, uri, credentials)
|
313
253
|
|
314
254
|
credentials.authenticate(request) unless credentials.nil?
|
315
255
|
|
316
256
|
begin
|
317
|
-
@http.request(
|
257
|
+
@http.request(uri, request)
|
318
258
|
rescue InternalHTTPError => e
|
319
259
|
raise ConnectionError.new(e)
|
320
260
|
end
|