annotate variant_effect_predictor/Bio/Root/HTTPget.pm @ 0:2bc9b66ada89 draft default tip

Uploaded
author mahtabm
date Thu, 11 Apr 2013 06:29:17 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
1 # $Id: HTTPget.pm,v 1.4 2002/10/22 07:38:37 lapp Exp $
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
2 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
3 # BioPerl module for fallback HTTP get operations.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
4 # Module is proxy-aware
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
5 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
6 # Cared for by Chris Dagdigian <dag@sonsorol.org>
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
7 # but all of the good stuff was written by
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
8 # Lincoln Stein.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
9 #
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
10 # You may distribute this module under the same terms as perl itself
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
11
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
12 # POD documentation - main docs before the code
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
13
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
14 =head1 NAME
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
15
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
16 Bio::Root::HTTPget - module for fallback HTTP get operations when
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
17 LWP:: is unavailable
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
18
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
19 =head1 SYNOPSIS
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
20
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
21 Use Bio::Root::HTTPget;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
22
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
23 my $response = get('http://localhost');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
24 $response = get('http://localhost/images');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
25
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
26 $response = eval { get('http://fred:secret@localhost/ladies_only/')
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
27 } or warn $@;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
28
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
29 $response = eval { get('http://jeff:secret@localhost/ladies_only/')
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
30 } or warn $@;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
31
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
32 $response = get('http://localhost/images/navauthors.gif');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
33 $response = get(-url=>'http://www.google.com',
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
34 -proxy=>'http://www.modperl.com');
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
35
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
36 =head1 DESCRIPTION
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
37
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
38 This is basically an last-chance module for doing network HTTP get requests in
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
39 situations where more advanced external CPAN modules such as LWP:: are not
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
40 installed.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
41
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
42 The particular reason this module was developed was so that the Open Bio
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
43 Database Access code can fallback to fetching the default registry files
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
44 from http://open-bio.org/registry/ without having to depend on
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
45 external dependencies like Bundle::LWP for network HTTP access.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
46
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
47 The core of this module was written by Lincoln Stein. It can handle proxies
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
48 and HTTP-based proxy authentication.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
49
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
50 =head1 FEEDBACK
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
51
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
52 =head2 Mailing Lists
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
53
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
54 User feedback is an integral part of the evolution of this
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
55 and other Bioperl modules. Send your comments and suggestions preferably
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
56 to one of the Bioperl mailing lists.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
57 Your participation is much appreciated.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
58
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
59 bioperl-l@bioperl.org - General discussion
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
60 http://bio.perl.org/MailList.html - About the mailing lists
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
61
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
62 =head2 Reporting Bugs
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
63
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
64 Report bugs to the Bioperl bug tracking system to help us keep track
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
65 the bugs and their resolution.
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
66 Bug reports can be submitted via email or the web:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
67
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
68 bioperl-bugs@bio.perl.org
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
69 http://bugzilla.bioperl.org/
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
70
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
71 =head1 AUTHOR - Lincoln Stein
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
72
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
73 Cared for by Chris Dagdigian <dag@sonsorol.org>
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
74
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
75 =head1 APPENDIX
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
76
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
77 The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
78
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
79 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
80
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
81
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
82 # Let the code begin...
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
83
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
84 package Bio::Root::HTTPget;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
85
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
86 use strict;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
87 use Bio::Root::Root;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
88 use IO::Socket qw(:DEFAULT :crlf);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
89 use vars '@ISA';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
90
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
91 @ISA = qw(Bio::Root::Root);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
92
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
93
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
94 =head2 get
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
95
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
96 Title : get
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
97 Usage :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
98 Function:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
99 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
100 Returns : string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
101 Args :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
102
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
103 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
104
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
105 sub get {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
106 my ($url,$proxy,$timeout,$auth_user,$auth_pass) =
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
107 __PACKAGE__->_rearrange([qw(URL PROXY TIMEOUT USER PASS)],@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
108 my $dest = $proxy || $url;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
109
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
110 my ($host,$port,$path,$user,$pass)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
111 = _http_parse_url($dest) or __PACKAGE__->throw("invalid URL $url");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
112 $auth_user ||= $user;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
113 $auth_pass ||= $pass;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
114 $path = $url if $proxy;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
115
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
116 # set up the connection
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
117 my $socket = _http_connect($host,$port) or __PACKAGE__->throw("can't connect: $@");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
118
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
119 # the request
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
120 print $socket "GET $path HTTP/1.0$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
121 print $socket "User-Agent: Bioperl fallback fetcher/1.0$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
122 # Support virtual hosts
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
123 print $socket "HOST: $host$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
124
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
125 if ($auth_user && $auth_pass) { # authentication information
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
126 my $token = _encode_base64("$auth_user:$auth_pass");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
127 print $socket "Authorization: Basic $token$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
128 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
129 print $socket "$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
130
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
131 # read the response
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
132 my $response;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
133 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
134 local $/ = "$CRLF$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
135 $response = <$socket>;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
136 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
137
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
138 my ($status_line,@other_lines) = split $CRLF,$response;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
139 my ($stat_code,$stat_msg) = $status_line =~ m!^HTTP/1\.[01] (\d+) (.+)!
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
140 or __PACKAGE__->throw("invalid response from web server: got $response");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
141
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
142 my %headers = map {/^(\S+): (.+)/} @other_lines;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
143 if ($stat_code == 302 || $stat_code == 301) { # redirect
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
144 my $location = $headers{Location} or __PACKAGE__->throw("invalid redirect: no Location header");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
145 return get($location,$proxy,$timeout); # recursive call
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
146 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
147
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
148 elsif ($stat_code == 401) { # auth required
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
149 my $auth_required = $headers{'WWW-Authenticate'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
150 $auth_required =~ /^Basic realm="([^\"]+)"/
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
151 or __PACKAGE__->throw("server requires unknown type of authentication: $auth_required");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
152 __PACKAGE__->throw("request failed: $status_line, realm = $1");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
153 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
154
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
155 elsif ($stat_code != 200) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
156 __PACKAGE__->throw("request failed: $status_line");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
157 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
158
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
159 $response = '';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
160 while (1) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
161 my $bytes = read($socket,$response,2048,length $response);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
162 last unless $bytes > 0;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
163 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
164
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
165 $response;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
166 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
167
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
168 =head2 getFH
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
169
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
170 Title : getFH
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
171 Usage :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
172 Function:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
173 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
174 Returns : string
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
175 Args :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
176
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
177 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
178
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
179 sub getFH {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
180 my ($url,$proxy,$timeout,$auth_user,$auth_pass) =
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
181 __PACKAGE__->_rearrange([qw(URL PROXY TIMEOUT USER PASS)],@_);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
182 my $dest = $proxy || $url;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
183
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
184 my ($host,$port,$path,$user,$pass)
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
185 = _http_parse_url($dest) or __PACKAGE__->throw("invalid URL $url");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
186 $auth_user ||= $user;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
187 $auth_pass ||= $pass;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
188 $path = $url if $proxy;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
189
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
190 # set up the connection
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
191 my $socket = _http_connect($host,$port) or __PACKAGE__->throw("can't connect: $@");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
192
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
193 # the request
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
194 print $socket "GET $path HTTP/1.0$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
195 print $socket "User-Agent: Bioperl fallback fetcher/1.0$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
196 # Support virtual hosts
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
197 print $socket "HOST: $host$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
198
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
199 if ($auth_user && $auth_pass) { # authentication information
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
200 my $token = _encode_base64("$auth_user:$auth_pass");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
201 print $socket "Authorization: Basic $token$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
202 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
203 print $socket "$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
204
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
205 # read the response
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
206 my $response;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
207 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
208 local $/ = "$CRLF$CRLF";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
209 $response = <$socket>;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
210 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
211
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
212 my ($status_line,@other_lines) = split $CRLF,$response;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
213 my ($stat_code,$stat_msg) = $status_line =~ m!^HTTP/1\.[01] (\d+) (.+)!
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
214 or __PACKAGE__->throw("invalid response from web server: got $response");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
215
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
216 my %headers = map {/^(\S+): (.+)/} @other_lines;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
217 if ($stat_code == 302 || $stat_code == 301) { # redirect
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
218 my $location = $headers{Location} or __PACKAGE__->throw("invalid redirect: no Location header");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
219 return get($location,$proxy,$timeout); # recursive call
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
220 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
221
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
222 elsif ($stat_code == 401) { # auth required
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
223 my $auth_required = $headers{'WWW-Authenticate'};
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
224 $auth_required =~ /^Basic realm="([^\"]+)"/
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
225 or __PACKAGE__->throw("server requires unknown type of authentication: $auth_required");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
226 __PACKAGE__->throw("request failed: $status_line, realm = $1");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
227 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
228
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
229 elsif ($stat_code != 200) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
230 __PACKAGE__->throw("request failed: $status_line");
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
231 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
232
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
233 # Now that we are reasonably sure the socket and request
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
234 # are OK we pass the socket back as a filehandle so it can
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
235 # be processed by the caller...
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
236
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
237 $socket;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
238
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
239 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
240
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
241
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
242 =head2 _http_parse_url
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
243
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
244 Title :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
245 Usage :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
246 Function:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
247 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
248 Returns :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
249 Args :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
250
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
251 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
252
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
253 sub _http_parse_url {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
254 my $url = shift;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
255 my ($user,$pass,$hostent,$path) =
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
256 $url =~ m!^http://(?:([^:]+):([^:]+)@)?([^/]+)(/?[^\#]*)! or return;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
257 $path ||= '/';
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
258 my ($host,$port) = split(':',$hostent);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
259 return ($host,$port||80,$path,$user,$pass);
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
260 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
261
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
262 =head2 _http_connect
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
263
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
264 Title :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
265 Usage :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
266 Function:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
267 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
268 Returns :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
269 Args :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
270
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
271 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
272
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
273 sub _http_connect {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
274 my ($host,$port,$timeout) = @_;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
275 my $sock = IO::Socket::INET->new(Proto => 'tcp',
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
276 Type => SOCK_STREAM,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
277 PeerHost => $host,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
278 PeerPort => $port,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
279 Timeout => $timeout,
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
280 );
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
281 $sock;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
282 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
283
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
284
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
285 =head2 _encode_base64
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
286
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
287 Title :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
288 Usage :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
289 Function:
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
290 Example :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
291 Returns :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
292 Args :
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
293
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
294 =cut
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
295
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
296 sub _encode_base64 {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
297 my $res = "";
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
298 my $eol = $_[1];
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
299 $eol = "\n" unless defined $eol;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
300 pos($_[0]) = 0; # ensure start at the beginning
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
301
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
302 $res = join '', map( pack('u',$_)=~ /^.(\S*)/, ($_[0]=~/(.{1,45})/gs));
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
303
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
304 $res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
305 # fix padding at the end
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
306 my $padding = (3 - length($_[0]) % 3) % 3;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
307 $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
308 # break encoded string into lines of no more than 76 characters each
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
309 if (length $eol) {
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
310 $res =~ s/(.{1,76})/$1$eol/g;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
311 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
312 return $res;
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
313 }
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
314
2bc9b66ada89 Uploaded
mahtabm
parents:
diff changeset
315 1;