annotate variant_effect_predictor/Bio/Root/HTTPget.pm @ 3:d30fa12e4cc5 default tip

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