kaiwren-patron 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +19 -0
- data/README.txt +62 -0
- data/Rakefile +135 -0
- data/VERSION.yml +4 -0
- data/ext/patron/extconf.rb +50 -0
- data/ext/patron/session_ext.c +444 -0
- data/lib/patron.rb +43 -0
- data/lib/patron/error.rb +55 -0
- data/lib/patron/request.rb +147 -0
- data/lib/patron/response.rb +65 -0
- data/lib/patron/session.rb +183 -0
- data/spec/patron_spec.rb +38 -0
- data/spec/request_spec.rb +75 -0
- data/spec/response_spec.rb +45 -0
- data/spec/session_spec.rb +215 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +36 -0
- metadata +86 -0
data/lib/patron.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Patron HTTP Client: Bootstrap script
|
4
|
+
## Copyright (c) 2008 The Hive http://www.thehive.com/
|
5
|
+
##
|
6
|
+
## Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
## of this software and associated documentation files (the "Software"), to deal
|
8
|
+
## in the Software without restriction, including without limitation the rights
|
9
|
+
## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
## copies of the Software, and to permit persons to whom the Software is
|
11
|
+
## furnished to do so, subject to the following conditions:
|
12
|
+
##
|
13
|
+
## The above copyright notice and this permission notice shall be included in
|
14
|
+
## all copies or substantial portions of the Software.
|
15
|
+
##
|
16
|
+
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
## THE SOFTWARE.
|
23
|
+
##
|
24
|
+
## -------------------------------------------------------------------
|
25
|
+
require 'yaml'
|
26
|
+
require 'pathname'
|
27
|
+
|
28
|
+
cwd = Pathname(__FILE__).dirname
|
29
|
+
$:.unshift(cwd.to_s) unless $:.include?(cwd.to_s) || $:.include?(cwd.expand_path.to_s)
|
30
|
+
|
31
|
+
require 'patron/session'
|
32
|
+
|
33
|
+
module Patron #:nodoc:
|
34
|
+
# Returns the version number of the Patron library as a string
|
35
|
+
def self.version
|
36
|
+
cwd = Pathname(__FILE__).dirname.expand_path.to_s
|
37
|
+
yaml = YAML.load_file(cwd + '/../VERSION.yml')
|
38
|
+
major = (yaml['major'] || yaml[:major]).to_i
|
39
|
+
minor = (yaml['minor'] || yaml[:minor]).to_i
|
40
|
+
patch = (yaml['patch'] || yaml[:patch]).to_i
|
41
|
+
"#{major}.#{minor}.#{patch}"
|
42
|
+
end
|
43
|
+
end
|
data/lib/patron/error.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Patron HTTP Client: Error definitions
|
4
|
+
## Copyright (c) 2008 The Hive http://www.thehive.com/
|
5
|
+
##
|
6
|
+
## Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
## of this software and associated documentation files (the "Software"), to deal
|
8
|
+
## in the Software without restriction, including without limitation the rights
|
9
|
+
## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
## copies of the Software, and to permit persons to whom the Software is
|
11
|
+
## furnished to do so, subject to the following conditions:
|
12
|
+
##
|
13
|
+
## The above copyright notice and this permission notice shall be included in
|
14
|
+
## all copies or substantial portions of the Software.
|
15
|
+
##
|
16
|
+
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
## THE SOFTWARE.
|
23
|
+
##
|
24
|
+
## -------------------------------------------------------------------
|
25
|
+
|
26
|
+
module Patron
|
27
|
+
|
28
|
+
# Base class for Patron exceptions.
|
29
|
+
class Error < StandardError; end
|
30
|
+
|
31
|
+
# The URL you passed to Patron used a protocol that it does not support.
|
32
|
+
# This most likely the result of a misspelled protocol string.
|
33
|
+
class UnsupportedProtocol < Error; end
|
34
|
+
|
35
|
+
# The URL was not properly formatted.
|
36
|
+
class URLFormatError < Error; end
|
37
|
+
|
38
|
+
# Could not resolve the remote host name.
|
39
|
+
class HostResolutionError < Error; end
|
40
|
+
|
41
|
+
# Failed to connect to the remote host.
|
42
|
+
class ConnectionFailed < Error; end
|
43
|
+
|
44
|
+
# A file transfer was shorter or larger than expected.
|
45
|
+
# This happens when the server first reports an expected transfer size,
|
46
|
+
# and then delivers data that doesn't match the previously given size.
|
47
|
+
class PartialFileError < Error; end
|
48
|
+
|
49
|
+
# Operation timeout. The specified time-out period was reached.
|
50
|
+
class TimeoutError < Error; end
|
51
|
+
|
52
|
+
# Too many redirects. When following redirects, Patron hit the maximum amount.
|
53
|
+
class TooManyRedirects < Error; end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Patron HTTP Client: Request class
|
4
|
+
## Copyright (c) 2008 The Hive http://www.thehive.com/
|
5
|
+
##
|
6
|
+
## Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
## of this software and associated documentation files (the "Software"), to deal
|
8
|
+
## in the Software without restriction, including without limitation the rights
|
9
|
+
## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
## copies of the Software, and to permit persons to whom the Software is
|
11
|
+
## furnished to do so, subject to the following conditions:
|
12
|
+
##
|
13
|
+
## The above copyright notice and this permission notice shall be included in
|
14
|
+
## all copies or substantial portions of the Software.
|
15
|
+
##
|
16
|
+
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
## THE SOFTWARE.
|
23
|
+
##
|
24
|
+
## -------------------------------------------------------------------
|
25
|
+
|
26
|
+
module Patron
|
27
|
+
|
28
|
+
# Represents the information necessary for an HTTP request.
|
29
|
+
# This is basically a data object with validation. Not all fields will be
|
30
|
+
# used in every request.
|
31
|
+
class Request
|
32
|
+
|
33
|
+
VALID_ACTIONS = [:get, :put, :post, :delete, :head, :copy]
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
@action = :get
|
37
|
+
@headers = {}
|
38
|
+
@timeout = 0
|
39
|
+
@connect_timeout = 0
|
40
|
+
@max_redirects = -1
|
41
|
+
end
|
42
|
+
|
43
|
+
attr_accessor :url, :username, :password, :file_name, :proxy, :auth_type, :insecure
|
44
|
+
attr_reader :action, :timeout, :connect_timeout, :max_redirects, :headers
|
45
|
+
attr_reader :auth_type
|
46
|
+
|
47
|
+
# Set the type of authentication to use for this request.
|
48
|
+
#
|
49
|
+
# @param [String, Symbol] type - The type of authentication to use for this request, can be one of
|
50
|
+
# :basic, :digest, or :any
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# sess.username = "foo"
|
54
|
+
# sess.password = "sekrit"
|
55
|
+
# sess.auth_type = :digest
|
56
|
+
def auth_type=(type=:basic)
|
57
|
+
@auth_type = case type
|
58
|
+
when :basic, "basic"
|
59
|
+
Request::AuthBasic
|
60
|
+
when :digest, "digest"
|
61
|
+
Request::AuthDigest
|
62
|
+
when :any, "any"
|
63
|
+
Request::AuthAny
|
64
|
+
else
|
65
|
+
raise "#{type.inspect} is an unknown authentication type"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def upload_data=(data)
|
70
|
+
@upload_data = case data
|
71
|
+
when Hash
|
72
|
+
hash_to_string(data)
|
73
|
+
else
|
74
|
+
data
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def upload_data
|
79
|
+
@upload_data
|
80
|
+
end
|
81
|
+
|
82
|
+
def action=(new_action)
|
83
|
+
if !VALID_ACTIONS.include?(new_action)
|
84
|
+
raise ArgumentError, "Action must be one of #{VALID_ACTIONS.join(', ')}"
|
85
|
+
end
|
86
|
+
|
87
|
+
@action = new_action
|
88
|
+
end
|
89
|
+
|
90
|
+
def timeout=(new_timeout)
|
91
|
+
if new_timeout && new_timeout.to_i < 1
|
92
|
+
raise ArgumentError, "Timeout must be a positive integer greater than 0"
|
93
|
+
end
|
94
|
+
|
95
|
+
@timeout = new_timeout.to_i
|
96
|
+
end
|
97
|
+
|
98
|
+
def connect_timeout=(new_timeout)
|
99
|
+
if new_timeout && new_timeout.to_i < 1
|
100
|
+
raise ArgumentError, "Timeout must be a positive integer greater than 0"
|
101
|
+
end
|
102
|
+
|
103
|
+
@connect_timeout = new_timeout.to_i
|
104
|
+
end
|
105
|
+
|
106
|
+
def max_redirects=(new_max_redirects)
|
107
|
+
if new_max_redirects.to_i < -1
|
108
|
+
raise ArgumentError, "Max redirects must be a positive integer, 0 or -1"
|
109
|
+
end
|
110
|
+
|
111
|
+
@max_redirects = new_max_redirects.to_i
|
112
|
+
end
|
113
|
+
|
114
|
+
def headers=(new_headers)
|
115
|
+
if !new_headers.kind_of?(Hash)
|
116
|
+
raise ArgumentError, "Headers must be a hash"
|
117
|
+
end
|
118
|
+
|
119
|
+
@headers = new_headers
|
120
|
+
end
|
121
|
+
|
122
|
+
def action_name
|
123
|
+
@action.to_s.upcase
|
124
|
+
end
|
125
|
+
|
126
|
+
def credentials
|
127
|
+
return nil if username.nil? || password.nil?
|
128
|
+
"#{username}:#{password}"
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
# serialize hash for Rails-style params
|
134
|
+
def hash_to_string(hash)
|
135
|
+
pairs = []
|
136
|
+
recursive = Proc.new do |h, prefix|
|
137
|
+
h.each_pair do |k,v|
|
138
|
+
key = prefix == '' ? k : "#{prefix}[#{k}]"
|
139
|
+
v.is_a?(Hash) ? recursive.call(v, key) : pairs << "#{key}=#{v}"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
recursive.call(hash, '')
|
143
|
+
return pairs.join('&')
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Patron HTTP Client: Response class
|
4
|
+
## Copyright (c) 2008 The Hive http://www.thehive.com/
|
5
|
+
##
|
6
|
+
## Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
## of this software and associated documentation files (the "Software"), to deal
|
8
|
+
## in the Software without restriction, including without limitation the rights
|
9
|
+
## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
## copies of the Software, and to permit persons to whom the Software is
|
11
|
+
## furnished to do so, subject to the following conditions:
|
12
|
+
##
|
13
|
+
## The above copyright notice and this permission notice shall be included in
|
14
|
+
## all copies or substantial portions of the Software.
|
15
|
+
##
|
16
|
+
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
## THE SOFTWARE.
|
23
|
+
##
|
24
|
+
## -------------------------------------------------------------------
|
25
|
+
|
26
|
+
module Patron
|
27
|
+
|
28
|
+
# Represents the response from the HTTP server.
|
29
|
+
class Response
|
30
|
+
|
31
|
+
def initialize
|
32
|
+
@header = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :url, :status, :status_line, :redirect_count, :body
|
36
|
+
|
37
|
+
def inspect
|
38
|
+
# Avoid spamming the console with the header and body data
|
39
|
+
"#<Patron::Response @status_line='#{@status_line}'>"
|
40
|
+
end
|
41
|
+
|
42
|
+
def headers
|
43
|
+
@header
|
44
|
+
end
|
45
|
+
private
|
46
|
+
|
47
|
+
# Called by the C code to parse and set the headers
|
48
|
+
def parse_headers(header_data)
|
49
|
+
header_data.split(/\r\n/).each do |header|
|
50
|
+
if header =~ %r|^HTTP/1.[01]|
|
51
|
+
@status_line = header.strip
|
52
|
+
else
|
53
|
+
parts = header.split(':', 2)
|
54
|
+
parts[1].strip! unless parts[1].nil?
|
55
|
+
if headers.has_key?(parts[0])
|
56
|
+
headers[parts[0]] << ",#{parts[1]}"
|
57
|
+
else
|
58
|
+
headers[parts[0]] = parts[1]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
## -------------------------------------------------------------------
|
2
|
+
##
|
3
|
+
## Patron HTTP Client: Session class
|
4
|
+
## Copyright (c) 2008 The Hive http://www.thehive.com/
|
5
|
+
##
|
6
|
+
## Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
## of this software and associated documentation files (the "Software"), to deal
|
8
|
+
## in the Software without restriction, including without limitation the rights
|
9
|
+
## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
## copies of the Software, and to permit persons to whom the Software is
|
11
|
+
## furnished to do so, subject to the following conditions:
|
12
|
+
##
|
13
|
+
## The above copyright notice and this permission notice shall be included in
|
14
|
+
## all copies or substantial portions of the Software.
|
15
|
+
##
|
16
|
+
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
+
## THE SOFTWARE.
|
23
|
+
##
|
24
|
+
## -------------------------------------------------------------------
|
25
|
+
require 'patron/error'
|
26
|
+
require 'patron/request'
|
27
|
+
require 'patron/response'
|
28
|
+
require 'patron/session_ext'
|
29
|
+
|
30
|
+
|
31
|
+
module Patron
|
32
|
+
|
33
|
+
# This class represents multiple request/response transactions with an HTTP
|
34
|
+
# server. This is the primary API for Patron.
|
35
|
+
class Session
|
36
|
+
|
37
|
+
# HTTP connection timeout in seconds. Defaults to 1 second.
|
38
|
+
attr_accessor :connect_timeout
|
39
|
+
|
40
|
+
# HTTP transaction timeout in seconds. Defaults to 5 seconds.
|
41
|
+
attr_accessor :timeout
|
42
|
+
|
43
|
+
# Maximum number of times to follow redirects.
|
44
|
+
# Set to 0 to disable and -1 to follow all redirects. Defaults to 5.
|
45
|
+
attr_accessor :max_redirects
|
46
|
+
|
47
|
+
# Prepended to the URL in all requests.
|
48
|
+
attr_accessor :base_url
|
49
|
+
|
50
|
+
# Username and password for http authentication
|
51
|
+
attr_accessor :username, :password
|
52
|
+
|
53
|
+
# HTTP proxy URL
|
54
|
+
attr_accessor :proxy
|
55
|
+
|
56
|
+
# Standard set of headers that are used in all requests.
|
57
|
+
attr_reader :headers
|
58
|
+
|
59
|
+
# Set the authentication type for the request.
|
60
|
+
# @see Patron::Request#auth_type
|
61
|
+
attr_accessor :auth_type
|
62
|
+
|
63
|
+
# Does this session stricly verify SSL certificates?
|
64
|
+
attr_accessor :insecure
|
65
|
+
|
66
|
+
private :ext_initialize, :handle_request, :enable_cookie_session
|
67
|
+
|
68
|
+
# Create a new Session object.
|
69
|
+
def initialize
|
70
|
+
ext_initialize
|
71
|
+
@headers = {}
|
72
|
+
@timeout = 5
|
73
|
+
@connect_timeout = 1
|
74
|
+
@max_redirects = 5
|
75
|
+
@auth_type = :basic
|
76
|
+
end
|
77
|
+
|
78
|
+
# Makes this session handle cookies and store them in in +file+.
|
79
|
+
# If file is nil they will be stored in memory. Otherwise the +file+
|
80
|
+
# must be readable and writable. Calling multiple times will add more files.
|
81
|
+
def handle_cookies(file = nil)
|
82
|
+
if file
|
83
|
+
path = Pathname(file).expand_path
|
84
|
+
unless File.exists?(file) and File.writable?(path.dirname)
|
85
|
+
raise ArgumentError, "Can't create file #{path} (permission error)"
|
86
|
+
end
|
87
|
+
unless File.readable?(file) or File.writable?(path)
|
88
|
+
raise ArgumentError, "Cant read or write file #{path} (permission error)"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
enable_cookie_session(path.to_s)
|
92
|
+
self
|
93
|
+
end
|
94
|
+
|
95
|
+
###################################################################
|
96
|
+
### Standard HTTP methods
|
97
|
+
###
|
98
|
+
|
99
|
+
# Retrieve the contents of the specified +url+ optionally sending the
|
100
|
+
# specified headers. If the +base_url+ varaible is set then it is prepended
|
101
|
+
# to the +url+ parameter. Any custom headers are merged with the contents
|
102
|
+
# of the +headers+ instance variable. The results are returned in a
|
103
|
+
# Response object.
|
104
|
+
def get(url, headers = {})
|
105
|
+
request(:get, url, headers)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Retrieve the contents of the specified +url+ as with #get, but the
|
109
|
+
# content at the URL is downloaded directly into the specified file.
|
110
|
+
def get_file(url, filename, headers = {})
|
111
|
+
request(:get, url, headers, :file => filename)
|
112
|
+
end
|
113
|
+
|
114
|
+
# As #get but sends an HTTP HEAD request.
|
115
|
+
def head(url, headers = {})
|
116
|
+
request(:head, url, headers)
|
117
|
+
end
|
118
|
+
|
119
|
+
# As #get but sends an HTTP DELETE request.
|
120
|
+
def delete(url, headers = {})
|
121
|
+
request(:delete, url, headers)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Uploads the passed +data+ to the specified +url+ using HTTP PUT. +data+
|
125
|
+
# must be a string.
|
126
|
+
def put(url, data, headers = {})
|
127
|
+
request(:put, url, headers, :data => data)
|
128
|
+
end
|
129
|
+
|
130
|
+
# Uploads the contents of a file to the specified +url+ using HTTP PUT.
|
131
|
+
def put_file(url, filename, headers = {})
|
132
|
+
request(:put, url, headers, :file => filename)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Uploads the passed +data+ to the specified +url+ using HTTP POST. +data+
|
136
|
+
# must be a string.
|
137
|
+
def post(url, data, headers = {})
|
138
|
+
request(:post, url, headers, :data => data)
|
139
|
+
end
|
140
|
+
|
141
|
+
# Uploads the contents of a file to the specified +url+ using HTTP POST.
|
142
|
+
def post_file(url, filename, headers = {})
|
143
|
+
request(:post, url, headers, :file => filename)
|
144
|
+
end
|
145
|
+
|
146
|
+
###################################################################
|
147
|
+
### WebDAV methods
|
148
|
+
###
|
149
|
+
|
150
|
+
# Sends a WebDAV COPY request to the specified +url+.
|
151
|
+
def copy(url, dest, headers = {})
|
152
|
+
headers['Destination'] = dest
|
153
|
+
request(:copy, url, headers)
|
154
|
+
end
|
155
|
+
|
156
|
+
###################################################################
|
157
|
+
### Basic API methods
|
158
|
+
###
|
159
|
+
|
160
|
+
# Send an HTTP request to the specified +url+.
|
161
|
+
def request(action, url, headers, options = {})
|
162
|
+
req = Request.new
|
163
|
+
req.action = action
|
164
|
+
req.timeout = self.timeout
|
165
|
+
req.connect_timeout = self.connect_timeout
|
166
|
+
req.max_redirects = self.max_redirects
|
167
|
+
req.headers = self.headers.merge(headers)
|
168
|
+
req.username = self.username
|
169
|
+
req.password = self.password
|
170
|
+
req.upload_data = options[:data]
|
171
|
+
req.file_name = options[:file]
|
172
|
+
req.proxy = proxy
|
173
|
+
req.auth_type = auth_type
|
174
|
+
req.insecure = insecure
|
175
|
+
|
176
|
+
req.url = self.base_url.to_s + url.to_s
|
177
|
+
raise ArgumentError, "Empty URL" if req.url.empty?
|
178
|
+
|
179
|
+
handle_request(req)
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
end
|