lyrics 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/bin/lyrics +66 -0
- data/lib/lyrics.rb +4 -0
- data/lib/lyrics/cli/application.rb +99 -0
- data/lib/lyrics/cli/optionsparser.rb +228 -0
- data/lib/lyrics/cli/pluginadapter.rb +56 -0
- data/lib/lyrics/cli/plugins.rb +79 -0
- data/lib/lyrics/cli/wikipluginadapter.rb +139 -0
- data/lib/lyrics/i18n/README +1 -0
- data/lib/lyrics/i18n/en.rb +181 -0
- data/lib/lyrics/i18n/es.rb +181 -0
- data/lib/lyrics/i18n/i18n.rb +126 -0
- data/lib/lyrics/i18n/sk.rb +174 -0
- data/lib/lyrics/itrans/COPYRIGHT +31 -0
- data/lib/lyrics/itrans/itrans +0 -0
- data/lib/lyrics/itrans/itrans.txt +8 -0
- data/lib/lyrics/itrans/lyric.txt +23 -0
- data/lib/lyrics/itrans/udvng.ifm +206 -0
- data/lib/lyrics/lyrics.rb +567 -0
- data/lib/lyrics/lyrics_AZLyrics.rb +113 -0
- data/lib/lyrics/lyrics_DarkLyrics.rb +124 -0
- data/lib/lyrics/lyrics_Giitaayan.rb +124 -0
- data/lib/lyrics/lyrics_Jamendo.rb +166 -0
- data/lib/lyrics/lyrics_LeosLyrics.rb +142 -0
- data/lib/lyrics/lyrics_LoudSongs.rb +135 -0
- data/lib/lyrics/lyrics_LyricWiki.rb +328 -0
- data/lib/lyrics/lyrics_LyricsDownload.rb +118 -0
- data/lib/lyrics/lyrics_LyricsMania.rb +141 -0
- data/lib/lyrics/lyrics_Lyriki.rb +286 -0
- data/lib/lyrics/lyrics_SeekLyrics.rb +108 -0
- data/lib/lyrics/lyrics_Sing365.rb +103 -0
- data/lib/lyrics/lyrics_TerraLetras.rb +126 -0
- data/lib/lyrics/mediawikilyrics.rb +1417 -0
- data/lib/lyrics/utils/formdata.rb +56 -0
- data/lib/lyrics/utils/htmlentities.rb +291 -0
- data/lib/lyrics/utils/http.rb +198 -0
- data/lib/lyrics/utils/itrans.rb +160 -0
- data/lib/lyrics/utils/logger.rb +123 -0
- data/lib/lyrics/utils/strings.rb +378 -0
- data/lib/lyrics/utils/xmlhash.rb +111 -0
- data/lyrics.gemspec +98 -0
- data/spec/lyrics_spec.rb +7 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +9 -0
- metadata +137 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Copyright (C) 2006-2008 by Sergio Pistone
|
|
2
|
+
# sergio_pistone@yahoo.com.ar
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program; if not, write to the
|
|
16
|
+
# Free Software Foundation, Inc.,
|
|
17
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
18
|
+
|
|
19
|
+
require "cgi"
|
|
20
|
+
|
|
21
|
+
module URLEncodedFormData
|
|
22
|
+
|
|
23
|
+
def URLEncodedFormData.prepare_query( params )
|
|
24
|
+
query = params.collect { |name, value| "#{name}=#{CGI.escape( value.to_s() )}" }.join( "&" )
|
|
25
|
+
header = { "Content-type" => "application/x-www-form-urlencoded" }
|
|
26
|
+
return query, header
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module MultipartFormData
|
|
32
|
+
|
|
33
|
+
@@boundary = "----------nOtA5FcjrNZuZ3TMioysxHGGCO69vA5iYysdBTL2osuNwOjcCfU7uiN"
|
|
34
|
+
|
|
35
|
+
def MultipartFormData.text_param( name, value )
|
|
36
|
+
return "Content-Disposition: form-data; name=\"#{CGI.escape(name)}\"\r\n" \
|
|
37
|
+
"\r\n" \
|
|
38
|
+
"#{value}\r\n"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def MultipartFormData.file_param( name, file, mime_type, content )
|
|
42
|
+
return "Content-Disposition: form-data; name=\"#{CGI.escape(name)}\"; filename=\"#{file}\"\r\n" \
|
|
43
|
+
"Content-Transfer-Encoding: binary\r\n" \
|
|
44
|
+
"Content-Type: #{mime_type}\r\n" \
|
|
45
|
+
"\r\n" \
|
|
46
|
+
"#{content}\r\n"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def MultipartFormData.prepare_query( params )
|
|
50
|
+
query = params.collect { |param| "--#{@@boundary}\r\n#{param}" }.join( "" ) + "--#{@@boundary}--"
|
|
51
|
+
header = { "Content-type" => "multipart/form-data; boundary=" + @@boundary }
|
|
52
|
+
return query, header
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# Copyright (C) 2006-2008 by Sergio Pistone
|
|
2
|
+
# sergio_pistone@yahoo.com.ar
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program; if not, write to the
|
|
16
|
+
# Free Software Foundation, Inc.,
|
|
17
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
18
|
+
|
|
19
|
+
module HTMLEntities
|
|
20
|
+
|
|
21
|
+
def HTMLEntities.decode!( text )
|
|
22
|
+
aux1 = text.gsub!( /&([a-zA-Z]+);/ ) { (n = @@named_entities[$1]) ? [n].pack( "U" ) : $0 }
|
|
23
|
+
aux2 = text.gsub!( /&#(\d{2,4});/ ) { [$1.to_i()].pack( "U" ) }
|
|
24
|
+
aux3 = text.gsub!( /&#x([0-9a-fA-F]{2,4});/ ) { [s.to_i(16)].pack( "U" ) }
|
|
25
|
+
return (aux1||aux2||aux3) ? text : nil
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def HTMLEntities.decode( text )
|
|
29
|
+
text = String.new( text )
|
|
30
|
+
HTMLEntities.decode!( text )
|
|
31
|
+
return text
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
@@named_entities = {
|
|
35
|
+
"quot" => 34,
|
|
36
|
+
"amp" => 38,
|
|
37
|
+
"lt" => 60,
|
|
38
|
+
"gt" => 62,
|
|
39
|
+
"OElig" => 338,
|
|
40
|
+
"oelig" => 339,
|
|
41
|
+
"Scaron" => 352,
|
|
42
|
+
"scaron" => 353,
|
|
43
|
+
"Yuml" => 376,
|
|
44
|
+
"circ" => 710,
|
|
45
|
+
"tilde" => 732,
|
|
46
|
+
"ensp" => 8194,
|
|
47
|
+
"emsp" => 8195,
|
|
48
|
+
"thinsp" => 8201,
|
|
49
|
+
"zwnj" => 8204,
|
|
50
|
+
"zwj" => 8205,
|
|
51
|
+
"lrm" => 8206,
|
|
52
|
+
"rlm" => 8207,
|
|
53
|
+
"ndash" => 8211,
|
|
54
|
+
"mdash" => 8212,
|
|
55
|
+
"lsquo" => 8216,
|
|
56
|
+
"rsquo" => 8217,
|
|
57
|
+
"sbquo" => 8218,
|
|
58
|
+
"ldquo" => 8220,
|
|
59
|
+
"rdquo" => 8221,
|
|
60
|
+
"bdquo" => 8222,
|
|
61
|
+
"dagger" => 8224,
|
|
62
|
+
"Dagger" => 8225,
|
|
63
|
+
"permil" => 8240,
|
|
64
|
+
"lsaquo" => 8249,
|
|
65
|
+
"rsaquo" => 8250,
|
|
66
|
+
"euro" => 8364,
|
|
67
|
+
|
|
68
|
+
"fnof" => 402,
|
|
69
|
+
"Alpha" => 913,
|
|
70
|
+
"Beta" => 914,
|
|
71
|
+
"Gamma" => 915,
|
|
72
|
+
"Delta" => 916,
|
|
73
|
+
"Epsilon" => 917,
|
|
74
|
+
"Zeta" => 918,
|
|
75
|
+
"Eta" => 919,
|
|
76
|
+
"Theta" => 920,
|
|
77
|
+
"Iota" => 921,
|
|
78
|
+
"Kappa" => 922,
|
|
79
|
+
"Lambda" => 923,
|
|
80
|
+
"Mu" => 924,
|
|
81
|
+
"Nu" => 925,
|
|
82
|
+
"Xi" => 926,
|
|
83
|
+
"Omicron" => 927,
|
|
84
|
+
"Pi" => 928,
|
|
85
|
+
"Rho" => 929,
|
|
86
|
+
"Sigma" => 931,
|
|
87
|
+
"Tau" => 932,
|
|
88
|
+
"Upsilon" => 933,
|
|
89
|
+
"Phi" => 934,
|
|
90
|
+
"Chi" => 935,
|
|
91
|
+
"Psi" => 936,
|
|
92
|
+
"Omega" => 937,
|
|
93
|
+
"alpha" => 945,
|
|
94
|
+
"beta" => 946,
|
|
95
|
+
"gamma" => 947,
|
|
96
|
+
"delta" => 948,
|
|
97
|
+
"epsilon" => 949,
|
|
98
|
+
"zeta" => 950,
|
|
99
|
+
"eta" => 951,
|
|
100
|
+
"theta" => 952,
|
|
101
|
+
"iota" => 953,
|
|
102
|
+
"kappa" => 954,
|
|
103
|
+
"lambda" => 955,
|
|
104
|
+
"mu" => 956,
|
|
105
|
+
"nu" => 957,
|
|
106
|
+
"xi" => 958,
|
|
107
|
+
"omicron" => 959,
|
|
108
|
+
"pi" => 960,
|
|
109
|
+
"rho" => 961,
|
|
110
|
+
"sigmaf" => 962,
|
|
111
|
+
"sigma" => 963,
|
|
112
|
+
"tau" => 964,
|
|
113
|
+
"upsilon" => 965,
|
|
114
|
+
"phi" => 966,
|
|
115
|
+
"chi" => 967,
|
|
116
|
+
"psi" => 968,
|
|
117
|
+
"omega" => 969,
|
|
118
|
+
"thetasym" => 977,
|
|
119
|
+
"upsih" => 978,
|
|
120
|
+
"piv" => 982,
|
|
121
|
+
"bull" => 8226,
|
|
122
|
+
"hellip" => 8230,
|
|
123
|
+
"prime" => 8242,
|
|
124
|
+
"Prime" => 8243,
|
|
125
|
+
"oline" => 8254,
|
|
126
|
+
"frasl" => 8260,
|
|
127
|
+
"weierp" => 8472,
|
|
128
|
+
"image" => 8465,
|
|
129
|
+
"real" => 8476,
|
|
130
|
+
"trade" => 8482,
|
|
131
|
+
"alefsym" => 8501,
|
|
132
|
+
"larr" => 8592,
|
|
133
|
+
"uarr" => 8593,
|
|
134
|
+
"rarr" => 8594,
|
|
135
|
+
"darr" => 8595,
|
|
136
|
+
"harr" => 8596,
|
|
137
|
+
"crarr" => 8629,
|
|
138
|
+
"lArr" => 8656,
|
|
139
|
+
"uArr" => 8657,
|
|
140
|
+
"rArr" => 8658,
|
|
141
|
+
"dArr" => 8659,
|
|
142
|
+
"hArr" => 8660,
|
|
143
|
+
"forall" => 8704,
|
|
144
|
+
"part" => 8706,
|
|
145
|
+
"exist" => 8707,
|
|
146
|
+
"empty" => 8709,
|
|
147
|
+
"nabla" => 8711,
|
|
148
|
+
"isin" => 8712,
|
|
149
|
+
"notin" => 8713,
|
|
150
|
+
"ni" => 8715,
|
|
151
|
+
"prod" => 8719,
|
|
152
|
+
"sum" => 8721,
|
|
153
|
+
"minus" => 8722,
|
|
154
|
+
"lowast" => 8727,
|
|
155
|
+
"radic" => 8730,
|
|
156
|
+
"prop" => 8733,
|
|
157
|
+
"infin" => 8734,
|
|
158
|
+
"ang" => 8736,
|
|
159
|
+
"and" => 8743,
|
|
160
|
+
"or" => 8744,
|
|
161
|
+
"cap" => 8745,
|
|
162
|
+
"cup" => 8746,
|
|
163
|
+
"int" => 8747,
|
|
164
|
+
"there4" => 8756,
|
|
165
|
+
"sim" => 8764,
|
|
166
|
+
"cong" => 8773,
|
|
167
|
+
"asymp" => 8776,
|
|
168
|
+
"ne" => 8800,
|
|
169
|
+
"equiv" => 8801,
|
|
170
|
+
"le" => 8804,
|
|
171
|
+
"ge" => 8805,
|
|
172
|
+
"sub" => 8834,
|
|
173
|
+
"sup" => 8835,
|
|
174
|
+
"nsub" => 8836,
|
|
175
|
+
"sube" => 8838,
|
|
176
|
+
"supe" => 8839,
|
|
177
|
+
"oplus" => 8853,
|
|
178
|
+
"otimes" => 8855,
|
|
179
|
+
"perp" => 8869,
|
|
180
|
+
"sdot" => 8901,
|
|
181
|
+
"lceil" => 8968,
|
|
182
|
+
"rceil" => 8969,
|
|
183
|
+
"lfloor" => 8970,
|
|
184
|
+
"rfloor" => 8971,
|
|
185
|
+
"lang" => 9001,
|
|
186
|
+
"rang" => 9002,
|
|
187
|
+
"loz" => 9674,
|
|
188
|
+
"spades" => 9824,
|
|
189
|
+
"clubs" => 9827,
|
|
190
|
+
"hearts" => 9829,
|
|
191
|
+
"diams" => 9830,
|
|
192
|
+
|
|
193
|
+
"nbsp" => 160,
|
|
194
|
+
"iexcl" => 161,
|
|
195
|
+
"cent" => 162,
|
|
196
|
+
"pound" => 163,
|
|
197
|
+
"curren" => 164,
|
|
198
|
+
"yen" => 165,
|
|
199
|
+
"brvbar" => 166,
|
|
200
|
+
"sect" => 167,
|
|
201
|
+
"uml" => 168,
|
|
202
|
+
"copy" => 169,
|
|
203
|
+
"ordf" => 170,
|
|
204
|
+
"laquo" => 171,
|
|
205
|
+
"not" => 172,
|
|
206
|
+
"shy" => 173,
|
|
207
|
+
"reg" => 174,
|
|
208
|
+
"macr" => 175,
|
|
209
|
+
"deg" => 176,
|
|
210
|
+
"plusmn" => 177,
|
|
211
|
+
"sup2" => 178,
|
|
212
|
+
"sup3" => 179,
|
|
213
|
+
"acute" => 180,
|
|
214
|
+
"micro" => 181,
|
|
215
|
+
"para" => 182,
|
|
216
|
+
"middot" => 183,
|
|
217
|
+
"cedil" => 184,
|
|
218
|
+
"sup1" => 185,
|
|
219
|
+
"ordm" => 186,
|
|
220
|
+
"raquo" => 187,
|
|
221
|
+
"frac14" => 188,
|
|
222
|
+
"frac12" => 189,
|
|
223
|
+
"frac34" => 190,
|
|
224
|
+
"iquest" => 191,
|
|
225
|
+
"Agrave" => 192,
|
|
226
|
+
"Aacute" => 193,
|
|
227
|
+
"Acirc" => 194,
|
|
228
|
+
"Atilde" => 195,
|
|
229
|
+
"Auml" => 196,
|
|
230
|
+
"Aring" => 197,
|
|
231
|
+
"AElig" => 198,
|
|
232
|
+
"Ccedil" => 199,
|
|
233
|
+
"Egrave" => 200,
|
|
234
|
+
"Eacute" => 201,
|
|
235
|
+
"Ecirc" => 202,
|
|
236
|
+
"Euml" => 203,
|
|
237
|
+
"Igrave" => 204,
|
|
238
|
+
"Iacute" => 205,
|
|
239
|
+
"Icirc" => 206,
|
|
240
|
+
"Iuml" => 207,
|
|
241
|
+
"ETH" => 208,
|
|
242
|
+
"Ntilde" => 209,
|
|
243
|
+
"Ograve" => 210,
|
|
244
|
+
"Oacute" => 211,
|
|
245
|
+
"Ocirc" => 212,
|
|
246
|
+
"Otilde" => 213,
|
|
247
|
+
"Ouml" => 214,
|
|
248
|
+
"times" => 215,
|
|
249
|
+
"Oslash" => 216,
|
|
250
|
+
"Ugrave" => 217,
|
|
251
|
+
"Uacute" => 218,
|
|
252
|
+
"Ucirc" => 219,
|
|
253
|
+
"Uuml" => 220,
|
|
254
|
+
"Yacute" => 221,
|
|
255
|
+
"THORN" => 222,
|
|
256
|
+
"szlig" => 223,
|
|
257
|
+
"agrave" => 224,
|
|
258
|
+
"aacute" => 225,
|
|
259
|
+
"acirc" => 226,
|
|
260
|
+
"atilde" => 227,
|
|
261
|
+
"auml" => 228,
|
|
262
|
+
"aring" => 229,
|
|
263
|
+
"aelig" => 230,
|
|
264
|
+
"ccedil" => 231,
|
|
265
|
+
"egrave" => 232,
|
|
266
|
+
"eacute" => 233,
|
|
267
|
+
"ecirc" => 234,
|
|
268
|
+
"euml" => 235,
|
|
269
|
+
"igrave" => 236,
|
|
270
|
+
"iacute" => 237,
|
|
271
|
+
"icirc" => 238,
|
|
272
|
+
"iuml" => 239,
|
|
273
|
+
"eth" => 240,
|
|
274
|
+
"ntilde" => 241,
|
|
275
|
+
"ograve" => 242,
|
|
276
|
+
"oacute" => 243,
|
|
277
|
+
"ocirc" => 244,
|
|
278
|
+
"otilde" => 245,
|
|
279
|
+
"ouml" => 246,
|
|
280
|
+
"divide" => 247,
|
|
281
|
+
"oslash" => 248,
|
|
282
|
+
"ugrave" => 249,
|
|
283
|
+
"uacute" => 250,
|
|
284
|
+
"ucirc" => 251,
|
|
285
|
+
"uuml" => 252,
|
|
286
|
+
"yacute" => 253,
|
|
287
|
+
"thorn" => 254,
|
|
288
|
+
"yuml" => 255,
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
end
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Copyright (C) 2006-2008 by Sergio Pistone
|
|
2
|
+
# sergio_pistone@yahoo.com.ar
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program; if not, write to the
|
|
16
|
+
# Free Software Foundation, Inc.,
|
|
17
|
+
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
18
|
+
|
|
19
|
+
require File.expand_path( File.dirname( __FILE__ ) + "/formdata" )
|
|
20
|
+
|
|
21
|
+
require "net/http"
|
|
22
|
+
require "uri"
|
|
23
|
+
|
|
24
|
+
module HTTP
|
|
25
|
+
|
|
26
|
+
# @@user_agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2"
|
|
27
|
+
@@user_agent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071110 Firefox/2.0.0.9"
|
|
28
|
+
# @@user_agent = "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12) Gecko/20080218 Firefox/2.0.0.12"
|
|
29
|
+
|
|
30
|
+
@@proxy_url = nil
|
|
31
|
+
@@proxy_excluded_urls = []
|
|
32
|
+
@@proxy_reverse = false # if true, excluded_urls list becomes a list with the _only_ urls the proxy should be used for
|
|
33
|
+
|
|
34
|
+
def HTTP.normalize_url( url, protocol="http" )
|
|
35
|
+
url = url.strip()
|
|
36
|
+
protocol_regexp = /^ *([^: ]+):\/+/
|
|
37
|
+
md = protocol_regexp.match( url )
|
|
38
|
+
return nil if md && md[1] != protocol
|
|
39
|
+
url.gsub!( /\/+$/, "" ) # remove / at the end of the url
|
|
40
|
+
url.gsub!( protocol_regexp, "" ) # remove the protocol part if there was one
|
|
41
|
+
return "#{protocol}://#{url}" # reinsert protocol part assuring protocol:// form
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def HTTP.set_proxy_settings( proxy_url, excluded_urls=[], reverse=false )
|
|
45
|
+
@@proxy_url = proxy_url ? HTTP.normalize_url( proxy_url, "http" ) : nil
|
|
46
|
+
@@proxy_reverse = @@proxy_url ? reverse : false
|
|
47
|
+
@@proxy_excluded_urls = []
|
|
48
|
+
if @@proxy_url
|
|
49
|
+
excluded_urls.each() do |url|
|
|
50
|
+
url = normalize_url( url, "http" )
|
|
51
|
+
@@proxy_excluded_urls.insert( -1, url ) if url && ! @@proxy_excluded_urls.include?( url )
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def HTTP.get_proxy_settings()
|
|
57
|
+
ret = [@@proxy_url ? @@proxy_url.dup : nil, [], @@proxy_reverse]
|
|
58
|
+
@@proxy_excluded_urls.each() { |url| ret[1][ret[1].size] = url.dup }
|
|
59
|
+
return ret
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# returns proxy_host, proxy_port, proxy_user, proxy_pass for given url
|
|
63
|
+
def HTTP.get_url_proxy_settings( url )
|
|
64
|
+
|
|
65
|
+
return nil, nil, nil, nil if ! @@proxy_url
|
|
66
|
+
proxy = HTTP.parse_uri( @@proxy_url )
|
|
67
|
+
return nil, nil, nil, nil if ! proxy.host
|
|
68
|
+
proxy.port = 80 if ! proxy.port
|
|
69
|
+
|
|
70
|
+
# check if given url should be treated specially
|
|
71
|
+
exception = false
|
|
72
|
+
@@proxy_excluded_urls.each() do |exception_url|
|
|
73
|
+
if url.index( exception_url ) == 0
|
|
74
|
+
exception = true
|
|
75
|
+
break
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
if exception && @@proxy_reverse || ! exception && ! @@proxy_reverse
|
|
80
|
+
return proxy.host, proxy.port, proxy.user, proxy.password
|
|
81
|
+
else
|
|
82
|
+
return nil, nil, nil, nil
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def HTTP.parse_uri( uri )
|
|
87
|
+
begin
|
|
88
|
+
return URI.parse( uri )
|
|
89
|
+
rescue URI::InvalidURIError
|
|
90
|
+
return URI.parse( URI.escape( uri ) )
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def HTTP.fetch_page_get( url, headers=nil, follow=10 )
|
|
95
|
+
begin
|
|
96
|
+
|
|
97
|
+
p_url = HTTP.parse_uri( url )
|
|
98
|
+
return nil, url if p_url.host == nil || p_url.port == nil || p_url.request_uri == nil
|
|
99
|
+
proxy_host, proxy_port, proxy_user, proxy_pass = HTTP.get_url_proxy_settings( url )
|
|
100
|
+
|
|
101
|
+
full_headers = {
|
|
102
|
+
"User-Agent" => @@user_agent,
|
|
103
|
+
"Referer" => "#{p_url.scheme}://#{p_url.host}",
|
|
104
|
+
}
|
|
105
|
+
full_headers.merge!( headers ) if headers
|
|
106
|
+
|
|
107
|
+
http = Net::HTTP.new( p_url.host, p_url.port, proxy_host, proxy_port, proxy_user, proxy_pass )
|
|
108
|
+
response = http.request_get( p_url.request_uri, full_headers )
|
|
109
|
+
|
|
110
|
+
case response
|
|
111
|
+
when Net::HTTPSuccess
|
|
112
|
+
when Net::HTTPRedirection, Net::HTTPFound
|
|
113
|
+
if follow == 0
|
|
114
|
+
response = nil
|
|
115
|
+
elsif follow > 0
|
|
116
|
+
response, url = HTTP.fetch_page_get( response["location"], nil, follow-1 )
|
|
117
|
+
end
|
|
118
|
+
else
|
|
119
|
+
response = nil
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
return response, url
|
|
123
|
+
|
|
124
|
+
rescue Errno::ETIMEDOUT, Errno::EBADF, EOFError => e
|
|
125
|
+
raise TimeoutError.new( e.to_s )
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def HTTP.fetch_page_post( url, params, headers=nil, follow=10 )
|
|
130
|
+
begin
|
|
131
|
+
p_url = HTTP.parse_uri( url )
|
|
132
|
+
return nil, url if p_url.host == nil || p_url.port == nil || p_url.request_uri == nil
|
|
133
|
+
proxy_host, proxy_port, proxy_user, proxy_pass = HTTP.get_url_proxy_settings( url )
|
|
134
|
+
|
|
135
|
+
data, full_headers = URLEncodedFormData.prepare_query( params )
|
|
136
|
+
full_headers["User-Agent"] = @@user_agent
|
|
137
|
+
full_headers["Referer"] = "#{p_url.scheme}://#{p_url.host}"
|
|
138
|
+
full_headers.merge!( headers ) if headers
|
|
139
|
+
|
|
140
|
+
http = Net::HTTP.new( p_url.host, p_url.port, proxy_host, proxy_port, proxy_user, proxy_pass )
|
|
141
|
+
response = http.request_post( p_url.request_uri, data, full_headers )
|
|
142
|
+
|
|
143
|
+
case response
|
|
144
|
+
when Net::HTTPSuccess
|
|
145
|
+
when Net::HTTPRedirection, Net::HTTPFound
|
|
146
|
+
if follow == 0
|
|
147
|
+
response = nil
|
|
148
|
+
elsif follow > 0
|
|
149
|
+
response, url = HTTP.fetch_page_get( response["location"], nil, follow-1 )
|
|
150
|
+
end
|
|
151
|
+
else
|
|
152
|
+
response = nil
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
return response, url
|
|
156
|
+
|
|
157
|
+
rescue Errno::ETIMEDOUT, Errno::EBADF, EOFError => e
|
|
158
|
+
raise TimeoutError.new( e.to_s )
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def HTTP.fetch_page_post_form_multipart( url, params, headers=nil, follow=10 )
|
|
163
|
+
begin
|
|
164
|
+
|
|
165
|
+
p_url = HTTP.parse_uri( url )
|
|
166
|
+
return nil, url if p_url.host == nil || p_url.port == nil || p_url.request_uri == nil
|
|
167
|
+
proxy_host, proxy_port, proxy_user, proxy_pass = HTTP.get_url_proxy_settings( url )
|
|
168
|
+
|
|
169
|
+
data, full_headers = MultipartFormData.prepare_query( params )
|
|
170
|
+
full_headers["User-Agent"] = @@user_agent
|
|
171
|
+
full_headers["Referer"] = "#{p_url.scheme}://#{p_url.host}"
|
|
172
|
+
full_headers.merge!( headers ) if headers
|
|
173
|
+
|
|
174
|
+
http = Net::HTTP.new( p_url.host, p_url.port, proxy_host, proxy_port, proxy_user, proxy_pass )
|
|
175
|
+
response = http.request_post( p_url.request_uri, data, full_headers )
|
|
176
|
+
|
|
177
|
+
case response
|
|
178
|
+
when Net::HTTPSuccess
|
|
179
|
+
when Net::HTTPRedirection, Net::HTTPFound
|
|
180
|
+
if follow == 0
|
|
181
|
+
response = nil
|
|
182
|
+
elsif follow > 0
|
|
183
|
+
response, url = HTTP.fetch_page_get( response["location"], nil, follow-1 )
|
|
184
|
+
end
|
|
185
|
+
else
|
|
186
|
+
response = nil
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
return response, url
|
|
190
|
+
|
|
191
|
+
rescue Errno::ETIMEDOUT, Errno::EBADF, EOFError => e
|
|
192
|
+
raise TimeoutError.new( e.to_s )
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
|