File Coverage

blib/lib/lib/http.pm
Criterion Covered Total %
statement 31 436 7.1
branch 3 260 1.1
condition 0 143 0.0
subroutine 9 30 30.0
pod 0 23 0.0
total 43 892 4.8


line stmt bran cond sub pod time code
1             #############################################################################
2             ## Name: http.pm
3             ## Purpose: lib::http
4             ## Author: Graciliano M. P.
5             ## Modified by:
6             ## Created: 2005-02-04
7             ## RCS-ID:
8             ## Copyright: (c) 2005 Graciliano M. P.
9             ## Licence: This program is free software; you can redistribute it and/or
10             ## modify it under the same terms as Perl itself
11             #############################################################################
12            
13             package lib::http ;
14            
15 1     1   8654 use strict qw(vars) ;
  1         2  
  1         46  
16            
17 1     1   6 use vars qw($VERSION @ISA $DEBUG %STATUS) ;
  1         3  
  1         102  
18            
19             $VERSION = '0.01' ;
20            
21             ###########
22             # REQUIRE #
23             ###########
24            
25 1     1   1191 use Socket ;
  1         4223  
  1         697  
26            
27             ########
28             # VARS #
29             ########
30            
31             my $AGENT = "lib::http/$VERSION Perl/$] ($^O)" ;
32            
33             my @MONTHS_DAYS = ('',31,28,31,30,31,30,31,31,30,31,30,31) ;
34            
35             my ( $ACCEPT_GZIP , $ENABLE_GZIP , @IDX_FIND , $FIND_IDX , %LIBS_IDX , @TMPDIRS ) ;
36             my ( $TMPDIR , $TMPFILE , @INC_LIB , %INC_LIB , %URLS , %LIB_TREE ) ;
37            
38 1     1   12 use constant URI_TIMEOUT => 60 ;
  1         1  
  1         104  
39 1     1   5 use constant USER_AGENT => "perl-lib-httpd/$VERSION libwww-perl/$LWP::VERSION Perl/$] ($^O)" ;
  1         2  
  1         6971  
40            
41             my @STATIC_TMPDIR = qw(libhttp lib/libhttp-tmp) ;
42            
43             my $LIB_VER = $] ;
44             $LIB_VER =~ s/(\d+)\.(\d\d\d)(\d\d\d)/$1 .'.'. ($2*1) .'.'. ($3*1)/ge ;
45            
46             my @LIB_VERSIONED = (
47             'lib','site/lib', ## win32
48             'perl5','site_perl','perl5/site_perl','perl5/vendor_perl' , ## linux
49             ) ;
50            
51             {
52             my @copy = @LIB_VERSIONED ;
53             foreach my $LIB_VERSIONED_i ( @copy ) {
54             push(@LIB_VERSIONED , "$LIB_VERSIONED_i/$LIB_VER") ;
55             }
56             }
57            
58             my %MONTHS_EG = (
59             'jan' => 1 ,
60             'feb' => 2 ,
61             'mar' => 3 ,
62             'apr' => 4 ,
63             'may' => 5 ,
64             'jun' => 6 ,
65             'jul' => 7 ,
66             'aug' => 8 ,
67             'sep' => 9 ,
68             'oct' => 10 ,
69             'nov' => 11 ,
70             'dec' => 12
71             );
72            
73             ##########
74             # IMPORT #
75             ##########
76            
77             sub import {
78 1     1   12 my $class = shift ;
79            
80 1 50       6 if ( @_ == 1 ) {
81 0 0       0 if ( $_[0] eq 'unlink_tmpfile' ) {
    0          
82 0         0 unlink_tmpfile(1) ;
83 0         0 return ;
84             }
85             elsif ( $_[0] =~ /debug/i ) {
86 0         0 $DEBUG = 1 ;
87 0         0 return ;
88             }
89             }
90            
91            
92 1         2 my ( @bases ) = @_ ;
93            
94 1 50       4 start() if @bases ;
95            
96 1         2 my %idx ;
97            
98 1         31 foreach my $bases_i ( @bases ) {
99 0         0 my $uri = $bases_i ;
100 0         0 $uri =~ s/\/*$/\// ;
101            
102 0 0       0 if ( !$INC_LIB{$uri}++ ) {
103 0         0 push(@INC_LIB , $uri) ;
104 0         0 push(@IDX_FIND , $uri) ;
105            
106 0         0 foreach my $LIB_VERSIONED_i ( @LIB_VERSIONED ) {
107 0         0 my $uri_ver = "$uri$LIB_VERSIONED_i" ;
108 0         0 $uri_ver =~ s/\/*$/\//gs ;
109 0 0 0     0 if ( scalar get_head($uri_ver) && !$INC_LIB{$uri_ver}++ ) {
110 0         0 push(@INC_LIB , $uri_ver) ;
111 0         0 push(@IDX_FIND , $uri_ver) ;
112             }
113             }
114             }
115             }
116            
117             }
118            
119             #########
120             # START #
121             #########
122            
123             sub start {
124 0 0   0 0 0 if ( !$TMPDIR ) {
125 0         0 foreach my $STATIC_TMPDIR_i ( @STATIC_TMPDIR ) {
126 0 0       0 if ( -d $STATIC_TMPDIR_i ) {
127 0         0 $TMPDIR = $STATIC_TMPDIR_i ;
128 0         0 last ;
129             }
130             }
131            
132 0 0       0 if ( !$TMPDIR ) {
133 0         0 my $tmp = tmpdir() ;
134 0 0 0     0 if ( $tmp && -d $tmp ) {
135 0         0 my @lyb = (a..z,0..9) ;
136 0         0 my $rand ;
137 0         0 $rand .= $lyb[ rand(@lyb) ] while length($rand) < 6 ;
138 0 0       0 $tmp .= '/' if $tmp !~ /[\\\/]$/ ;
139 0         0 $tmp .= "libhttp-$rand-tmp" ;
140 0         0 mkpath($tmp) ;
141 0 0       0 if ( -d $tmp ) {
142 0         0 $TMPDIR = $tmp ;
143 0         0 push(@TMPDIRS , $TMPDIR) ;
144             }
145             }
146             }
147            
148 0         0 $TMPFILE = "$TMPDIR/libhttp.tmp" ;
149             }
150            
151 0         0 my ($hash_hook , $has_lib) ;
152 0         0 foreach my $INC_i ( @INC ) {
153 0 0       0 $hash_hook = 1 if $INC_i == \&hook ;
154 0 0       0 $has_lib = 1 if $INC_i eq $TMPDIR ;
155             }
156            
157 0 0       0 push(@INC , \&hook) if !$hash_hook ;
158 0 0       0 push(@INC , $TMPDIR) if !$has_lib ;
159            
160 0 0       0 $SIG{INT} = \&end if !$SIG{INT} ;
161            
162 0         0 return 1 ;
163             }
164            
165             ###############
166             # ENABLE_GZIP #
167             ###############
168            
169             sub enable_gzip {
170 0 0   0 0 0 return if $ENABLE_GZIP ;
171 0         0 $ENABLE_GZIP = 2 ;
172            
173 0         0 eval('use Compress::Zlib ;') ;
174            
175 0 0 0     0 if ( !$@ && defined &Compress::Zlib::memGunzip ) {
176 0         0 $ACCEPT_GZIP = 1 ;
177 0 0       0 print ">> *** GZIP ON ***\n" if $DEBUG ;
178             }
179            
180 0         0 $ENABLE_GZIP = 1 ;
181             }
182            
183             ############
184             # FIND_IDX #
185             ############
186            
187             sub find_idx {
188 0 0   0 0 0 return if $FIND_IDX ;
189 0         0 $FIND_IDX = 1 ;
190            
191 0         0 my %idx ;
192            
193 0         0 foreach my $IDX_FIND_i ( @IDX_FIND ) {
194 0         0 my $fl_idx = "${IDX_FIND_i}libhttp.idx" ;
195            
196 0         0 my $fl_idx_local = $fl_idx ;
197 0         0 $fl_idx_local =~ s/^http:\/\///si ;
198 0         0 $fl_idx_local =~ s/\./_/gs ;
199 0         0 $fl_idx_local =~ s/\W/-/gs ;
200 0         0 $fl_idx_local =~ s/_idx$/.idx/gi ;
201            
202 0         0 $fl_idx_local = "$TMPDIR/$fl_idx_local" ;
203            
204 0         0 my ($idx , $idx_time) ;
205            
206 0         0 my ($fl_size , $mdf_time) = (stat($fl_idx_local))[7,9] ;
207 0 0       0 if ( $fl_size ) {
208 0         0 my ( $code , $modf , $length ) = get_head($fl_idx) ;
209            
210 0 0 0     0 if ( $code == 200 && $fl_size == $length && $mdf_time >= $modf ) {
      0        
211 0         0 $idx_time = $mdf_time ;
212 0         0 open (IDX,$fl_idx_local) ; binmode(IDX) ;
  0         0  
213 0         0 1 while( read(IDX, $idx , 1024*4 , length($idx) ) ) ;
214 0         0 close(IDX) ;
215             }
216             }
217            
218 0 0       0 if ( !$idx ) {
219 0         0 my $modf ;
220 0 0       0 ( $idx , undef , $modf ) = get_url("$fl_idx.gz" , undef , 1) if $ENABLE_GZIP ;
221 0 0       0 ( $idx , undef , $modf ) = get_url($fl_idx , undef , 1) if !$idx ;
222            
223 0 0       0 if ( $idx ) {
224 0         0 $idx_time = $modf ;
225 0         0 open (IDX,">$fl_idx_local") ; binmode(IDX) ;
  0         0  
226 0         0 print IDX $idx ;
227 0         0 close (IDX) ;
228 0         0 utime($modf , $modf , $fl_idx_local) ;
229             }
230             }
231            
232 0 0       0 $idx{$IDX_FIND_i} = [$idx , $idx_time] if $idx ;
233             }
234            
235 0         0 foreach my $Key (sort keys %idx ) {
236 0         0 $LIBS_IDX{lib}{$Key} = $idx{$Key}[1] ;
237            
238 0         0 my (@files) = split( /(?:"\r\n?|\n)+/s , $idx{$Key}[0] ) ;
239            
240 0         0 foreach my $files_i ( @files ) {
241 0         0 my ($file , $size) = split(/\s+=\s+/s , $files_i) ;
242 0         0 $size =~ s/\s+//gs ;
243 0         0 $LIBS_IDX{"$Key$file"} = $size ;
244 0         0 $LIBS_IDX{libs}{"$Key$file"} = [$Key , $file] ;
245 0         0 my ($dir) = ( $file =~ /(.*?)[^\\\/]+$/ ) ;
246 0         0 $LIBS_IDX{dirs}{"$Key$dir"} = 1 ;
247 0         0 $LIBS_IDX{path}{$dir}{$Key} = 1 ;
248             }
249             }
250            
251             ##print "*** IDX ON!\n" ; ;
252            
253             }
254            
255             ########
256             # HOOK #
257             ########
258            
259             sub hook {
260 0     0 0 0 my $code = shift ;
261 0         0 my $module = shift ;
262            
263 0         0 unlink_tmpfile() ;
264            
265             ## enable_gzip() ;
266             ## find_idx() if $ENABLE_GZIP != 2 ;
267            
268 0         0 find_idx() ;
269 0         0 enable_gzip() ;
270            
271 0         0 foreach my $INC_LIB_i ( @INC_LIB ) {
272 0         0 my $uri = $INC_LIB_i . $module ; #URI->new_abs($module , $INC_LIB_i)->canonical ;
273 0         0 check_module_dep($uri , $module) ;
274 0         0 my $fl = get_file($uri , $module) ;
275 0 0       0 return $fl if ref $fl ;
276 0 0       0 last if $fl ;
277             }
278            
279             ## Return undef since tmpdir is at @INC:
280 0         0 return undef ;
281             }
282            
283             ####################
284             # CHECK_MODULE_DEP #
285             ####################
286            
287             sub check_module_dep {
288 0     0 0 0 my ( $url , $module ) = @_ ;
289            
290 0         0 my $pack = $module ;
291 0         0 $pack =~ s/[\\\/]/::/gs ;
292 0         0 $pack =~ s/\.(?:pm|pl|al)$//si ;
293 0         0 $pack =~ s/::/\//gs ;
294 0         0 $pack =~ s/[\\\/]*$/\//s ;
295            
296 0         0 my @dep ;
297            
298 0         0 foreach my $INC_LIB_i ( @INC_LIB ) {
299 0         0 push(@dep , [$INC_LIB_i , $pack]) ;
300 0         0 push(@dep , [$INC_LIB_i , "auto/$pack"]) ;
301             }
302            
303 0         0 foreach my $dep_i ( @dep ) {
304 0         0 get_tree(@$dep_i) ;
305             }
306             }
307            
308             ############
309             # GET_TREE #
310             ############
311            
312             sub get_tree {
313 0     0 0 0 my ( $inc_base , $dir ) = @_ ;
314            
315             #print "DEP> $inc_base $dir\n" ;
316            
317 0         0 my @files ;
318            
319 0 0 0     0 if ( %LIBS_IDX && $LIBS_IDX{dirs}{"$inc_base$dir"} ) {
320 0         0 foreach my $Key ( sort keys %LIBS_IDX ) {
321 0 0 0     0 next if !$LIBS_IDX{$Key} || $Key =~ /\.gz$/ || $Key !~ /^\Q$inc_base$dir\E/ ;
      0        
322 0 0 0     0 if ( $inc_base =~ /^\Q$LIBS_IDX{libs}{$Key}[0]\E/ && $Key =~ /^\Q$inc_base\E(.*)/ ) {
323 0         0 push(@files , $1) ;
324             }
325             }
326             }
327            
328 0 0       0 if ( !@files ) {
329 0         0 my $has_lib_idx ;
330 0         0 foreach my $Key ( keys %{ $LIBS_IDX{lib} } ) {
  0         0  
331 0 0       0 $has_lib_idx = 1 if $inc_base =~ /^\Q$Key\E/i ;
332             }
333 0 0       0 @files = get_dir("$inc_base$dir" , $dir) if !$has_lib_idx ;
334             }
335            
336 0         0 foreach my $files_i ( @files ) {
337             ##print "FL> $inc_base > $files_i\n" ;
338 0 0       0 if ( $files_i =~ /\/$/ ) {
339 0         0 get_tree($inc_base , $files_i) ;
340             }
341             else {
342 0 0       0 get_file("$inc_base$files_i" , $files_i) if $files_i !~ /\.pm$/ ;
343             }
344             }
345            
346             }
347            
348             #####################
349             # GET_DIR_RECURSIVE #
350             #####################
351            
352             sub get_dir_recursive {
353 0     0 0 0 my ( $inc_base , $dir ) = @_ ;
354            
355 0         0 my @files = get_dir("$inc_base$dir" , $dir) ;
356            
357 0         0 my @tree ;
358            
359 0         0 foreach my $files_i ( @files ) {
360 0 0       0 if ( $files_i =~ /\/$/ ) {
361 0         0 push(@tree , get_dir_recursive($inc_base , $files_i) ) ;
362             }
363             else {
364 0         0 push(@tree , $files_i) ;
365             }
366             }
367            
368 0         0 return @tree ;
369             }
370            
371             ###########
372             # GET_DIR #
373             ###########
374            
375             sub get_dir {
376 0     0 0 0 my ( $url_base , $pack_base ) = @_ ;
377            
378 0         0 my $dir = get_url($url_base , undef , 1) ;
379            
380 0 0       0 return if !$dir ;
381            
382 0         0 my @files = parse_dir($dir) ;
383            
384 0         0 foreach my $files_i ( @files ) {
385 0         0 $files_i = "$pack_base$files_i" ;
386             }
387            
388 0         0 return @files ;
389             }
390            
391             #############
392             # PARSE_DIR #
393             #############
394            
395             sub parse_dir {
396 0     0 0 0 my ( $dir ) = @_ ;
397            
398 0         0 my (@links) = ( $dir =~ /]*?href=['"]([^'"]+)['"]>.*?<\/a>/gsi );
399            
400 0         0 my @files ;
401 0         0 foreach my $links_i ( @links ) {
402 0 0 0     0 next if $links_i !~ /(?:\w|\/)$/ || $links_i =~ /^(?:mailto:|\?|\/)/ ;
403 0         0 push(@files , $links_i) ;
404             }
405            
406 0         0 return @files ;
407             }
408            
409             #################
410             # GET_MODULE_FH #
411             #################
412            
413             sub get_module_fh {
414 0     0 0 0 my ( $uri , $module ) = @_ ;
415            
416 0         0 my $new_file ;
417            
418 0   0     0 $new_file = get_file($uri , $module) || return ;
419            
420 0         0 open (my $fh , $new_file) ; binmode($fh) ;
  0         0  
421 0         0 return $fh ;
422             }
423            
424             ############
425             # GET_FILE #
426             ############
427            
428             sub get_file {
429 0     0 0 0 my ( $uri , $module ) = @_ ;
430            
431 0 0 0     0 return if (time - $URLS{$uri}{t}) < URI_TIMEOUT && $URLS{$uri}{status} == 404 ;
432            
433 0 0       0 my $new_file = $TMPDIR =~ /[\\\/]$/ ? "$TMPDIR$module" : "$TMPDIR/$module" ;
434 0         0 my $file_dir = $new_file ;
435 0         0 $file_dir =~ s/[^\\\/]+$//gs ;
436 0         0 mkpath($file_dir) ;
437            
438 0 0 0     0 if ( -s $new_file && $LIBS_IDX{$uri} ) {
439 0         0 my ($fl_size , $mdf_time) = (stat($new_file))[7,9] ;
440 0         0 my $idx_time ;
441 0         0 foreach my $Key ( sort keys %{ $LIBS_IDX{lib} } ) {
  0         0  
442 0 0       0 $idx_time = $LIBS_IDX{lib}{$Key} if $uri =~ /^\Q$Key\E/i ;
443             }
444            
445 0 0 0     0 return $new_file if $LIBS_IDX{$uri} == $fl_size && $idx_time ;
446            
447 0         0 my ( $code , $modf , $length ) = get_head($uri) ;
448            
449 0 0 0     0 return $new_file if $code == 200 && $fl_size == $length && $mdf_time >= $modf ;
      0        
450 0 0       0 return if $code != 200 ;
451             }
452            
453 0         0 my ($data , $code , $fl_time) ;
454            
455 0 0 0     0 if ( $ACCEPT_GZIP && $uri !~ /(?:\.gz|\/)$/i ) {
456 0         0 my $uri_gz = "$uri.gz" ;
457 0 0 0     0 if ( %LIBS_IDX && $LIBS_IDX{$uri_gz} ) {
458 0         0 ($data , $code , $fl_time) = get_url($uri_gz) ;
459 0 0       0 $data = '' if $code != 200 ;
460             }
461             }
462            
463 0 0 0     0 if ( $data eq '' && %LIBS_IDX ) {
464 0         0 my $has_lib_idx ;
465 0         0 foreach my $Key ( keys %{ $LIBS_IDX{lib} } ) {
  0         0  
466 0 0       0 $has_lib_idx = 1 if $uri =~ /^\Q$Key\E/i ;
467             }
468 0 0 0     0 return if $has_lib_idx && !$LIBS_IDX{$uri} ;
469             }
470            
471 0         0 unlink($new_file) ;
472            
473 0 0       0 ($data , $code , $fl_time) = get_url($uri) if $data eq '' ;
474            
475 0         0 $URLS{$uri}{t} = time ;
476 0 0 0     0 if ( $data eq '' || $code != 200 ) {
477 0         0 $URLS{$uri}{status} = 404 ;
478 0         0 return ;
479             }
480             else {
481 0         0 $URLS{$uri}{status} = 200 ;
482             }
483            
484 0 0       0 if ( is_file_hidden(undef , $data) ) {
485 0         0 $data =~ s/(?:\r\n?|\n)__END__(?:\r\n?|\n).*?$//s ;
486 0         0 $data =~ s/(?:\r\n?|\n)__DATA__(?:\r\n?|\n).*?$//s ;
487            
488 0         0 open (my $fh,">$TMPFILE") ; binmode($fh) ;
  0         0  
489 0         0 print $fh $data ;
490 0         0 print $fh "\n\n use lib::http 'unlink_tmpfile' ;\n\n" ;
491 0         0 close ($fh) ;
492            
493 0         0 open (TMPFILE,$TMPFILE) ; binmode(TMPFILE) ;
  0         0  
494 0         0 return \*TMPFILE ;
495             }
496            
497 0         0 open (my $fh,">$new_file") ; binmode($fh) ;
  0         0  
498 0         0 print $fh $data ;
499 0         0 close ($fh) ;
500            
501 0         0 utime($fl_time , $fl_time , $new_file) ;
502            
503 0 0       0 return if !-s $new_file ;
504            
505 0         0 return $new_file ;
506             }
507            
508             ############
509             # GET_HEAD #
510             ############
511            
512             sub get_head {
513 0 0 0 0 0 0 return if %LIBS_IDX && $LIBS_IDX{lib}{$LIBS_IDX{libs}{$_[0]}[0]} && !$LIBS_IDX{$_[0]} ;
      0        
514 0         0 return get_url($_[0],1,1) ;
515             }
516            
517             ###########
518             # GET_URL #
519             ###########
520            
521             sub get_url {
522 0     0 0 0 my ( $url , $head , $force ) = @_ ;
523            
524 0         0 unlink_tmpfile() ;
525            
526 0 0 0     0 return if !$force && (time - $URLS{$url}{t}) < URI_TIMEOUT && ($URLS{$url}{status} == 404 || $url =~ /\/$/) ;
      0        
      0        
527            
528             #print ">> $url\n" if !$head ;
529            
530 0         0 my ( $host , $port , $path ) = ( $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$, ) ;
531 0 0       0 if ($host !~ /\w/s) { return ;}
  0         0  
532            
533 0 0 0     0 if ($port eq '' || $port == 0 || $port !~ /^[\d]+$/) { $port = 80 ;}
  0   0     0  
534 0 0       0 if ($path eq '') { $path = '/' ;}
  0         0  
535            
536 0         0 my $socket ;
537            
538 0         0 for(1..3) {
539 0         0 $socket = new_socket($host , $port) ;
540 0 0       0 last if $socket ;
541             }
542            
543 0 0       0 my $proto = $head ? 'HEAD' : 'GET' ;
544            
545 0         0 my $netloc = $host ;
546 0 0       0 $netloc .= ":$port" if $port != 80 ;
547            
548 0 0       0 print $socket join("\015\012",
549             "$proto $path HTTP/1.0" ,
550             "Host: $netloc" ,
551             ($ACCEPT_GZIP ? 'Accept-Encoding: gzip' : () ) ,
552             "User-Agent: $AGENT" ,
553             'Connection: close' ,
554             '',''
555             ) ;
556            
557 0         0 my $buffer ;
558 0         0 while( read($socket, $buffer , 1024*4 , length($buffer) ) ) {
559             #$buffer =~ s/\r\n?/\n/gs ;
560             #print "$buffer\n" ;
561             } ;
562            
563 0         0 close($socket) ;
564            
565             #print "$buffer\n" ;
566            
567 0         0 my ($headers , $content) = split(/(?:\015\012|\r\n){2}/ , $buffer , 2) ;
568            
569 0         0 ++$STATUS{loads} ;
570 0         0 $STATUS{bandwidth} += length($buffer) ;
571            
572 0 0       0 if ( $DEBUG ) {
573 0         0 print ">> $url\n" ;
574 0         0 print ">> LOADS> $STATUS{loads}\n" ;
575 0         0 print ">> BANDWIDTH> ". ( int($STATUS{bandwidth}/1024) ) ."Kb\n" ;
576             }
577            
578 0         0 $buffer = undef ;
579            
580             #print "$headers\n" ;
581            
582 0         0 my ($code) = ( $headers =~ /HTTP[^\s]*[\s]+([\d]+)[\s]+[\w]+?/gsi ) ;
583 0         0 my ($type) = ( $headers =~ /Content-Type\:?[\s]+([^\n\r]*)[\n\r]?/gsi ) ;
584 0         0 my ($length) = ( $headers =~ /Content-Length\:?[\s]+([^\n\r]*)[\n\r]?/gsi ) ;
585 0         0 my ($modf) = ( $headers =~ /Last-Modified\:?[\s]+([^\n\r]*)[\n\r]?/gsi ) ;
586            
587 0 0       0 if ($modf =~ /,\s+\d+[\s-]+\w+[\s-]+\d+\s+\d+[:-]\d+[:-]\d+/i) {
588 0         0 my ($day,$mon,$year,$hour,$min,$sec) = ($modf =~ /,\s+(\d+)[\s-]+(\w+)+[\s-]+(\d+)\s+(\d+)[:-](\d+)[:-](\d+)/i ) ;
589 0 0       0 $mon = $MONTHS_EG{lc($mon)} if $mon !~ /^\d+$/ ;
590 0         0 $modf = timelocal($year,$mon,$day,$hour,$min,$sec) ;
591 0         0 } else { $modf = '' ;}
592            
593 0 0 0     0 if ( $ACCEPT_GZIP && ($headers =~ /Content-Encoding:\s*gzip/si || $path =~ /\.gz$/i) ) {
      0        
594 0         0 $content = Compress::Zlib::memGunzip($content) ;
595             }
596            
597 0         0 $URLS{$url}{t} = time ;
598 0         0 $URLS{$url}{status} = $code ;
599            
600 0 0       0 $content = '' if $code != 200 ;
601            
602 0 0       0 return ( ($head ? () : $content) , $code , $modf , $length , $type ) if wantarray ;
    0          
603            
604 0 0       0 return if $code != 200 ;
605            
606 0 0       0 return $code if $head ;
607 0         0 return $content ;
608             }
609            
610             ##############
611             # NEW_SOCKET #
612             ##############
613            
614             sub new_socket {
615 0     0 0 0 my ( $host , $port ) = @_ ;
616            
617 0   0     0 my $iaddr = inet_aton($host) || return ;
618 0   0     0 my $paddr = sockaddr_in($port, $iaddr) || return ;
619 0   0     0 my $proto = getprotobyname('tcp') || return ;
620            
621 0 0       0 socket(SOCK, PF_INET, SOCK_STREAM, $proto) || return ;
622            
623 0 0       0 connect(SOCK, $paddr) || return ;
624            
625 0         0 my $sel = select(SOCK) ; $|=1 ; select($sel) ;
  0         0  
  0         0  
626            
627 0         0 return \*SOCK ;
628             }
629            
630             #############
631             # TIMELOCAL #
632             #############
633            
634             sub timelocal {
635 0     0 0 0 my ( $year,$mon,$day,$hour,$min,$sec ) = @_ ;
636            
637 0         0 my $year_0 = (gmtime(1))[5] + 1900 ;
638            
639 0         0 my ($now_sec,$now_min,$now_hour,$now_mday,$now_mon,$now_year) = gmtime( time ) ;
640            
641 0 0 0     0 if (!$year || $year eq '*' || $year < $year_0) { $year = $now_year ;}
  0   0     0  
642            
643 0         0 my $year_bisexto = 0 ;
644 0 0       0 if ( is_leap_year($year) ) { $year_bisexto = 1 ;}
  0         0  
645            
646 0 0 0     0 if (!$mon || $mon eq '*') { $mon = $now_mon }
  0 0 0     0  
    0 0        
    0 0        
    0 0        
    0          
647 0         0 elsif ($mon < 1 || $mon > 12 ) { return }
648            
649 0         0 elsif (!$day || $day eq '*') { $day = $now_mday }
650 0         0 elsif ($day < 1 || $day > 31 ) { return }
651             elsif ($mon == 2 && $day > 28) {
652 0 0       0 $day = 28 if !check_date($year,$mon,$day) ;
653             }
654 0         0 elsif ($day > check_date($mon) ) { return }
655            
656 0 0 0     0 if ($hour eq '') { $hour = 0 }
  0 0       0  
    0          
    0          
657 0         0 elsif ($hour eq '*') { $hour = $now_hour }
658 0         0 elsif ($hour == 24) { $hour = 0 }
659 0         0 elsif ($hour < 0 || $hour > 24 ) { return }
660            
661 0 0 0     0 if ($min eq '') { $min = 0 }
  0 0       0  
    0          
    0          
662 0         0 elsif ($min eq '*') { $min = $now_min }
663 0         0 elsif ($min == 60) { $min = 59 }
664 0         0 elsif ($min < 0 || $min > 60 ) { return }
665            
666 0 0 0     0 if ($sec eq '') { $sec = 0 }
  0 0       0  
    0          
    0          
667 0         0 elsif ($sec eq '*') { $sec = $now_sec }
668 0         0 elsif ($sec == 60) { $sec = 59 }
669 0         0 elsif ($sec < 0 || $sec > 60 ) { return }
670            
671 0         0 my $timelocal ;
672            
673 0         0 my $time_day = 60*60*24 ;
674 0         0 my $time_year = $time_day * 365 ;
675            
676 0         0 for my $y ($year_0..($year-1)) {
677 0         0 $timelocal += $time_year ;
678 0 0       0 if ( is_leap_year($y) ) { $timelocal += $time_day ;}
  0         0  
679             }
680            
681 0         0 for my $m (1..($mon-1)) {
682 0         0 my $month_days = &check_date($m) ;
683 0         0 $timelocal += $month_days * $time_day ;
684             }
685            
686 0 0 0     0 if ($year_bisexto == 1 && $mon > 2) { $timelocal += $time_day ;}
  0         0  
687            
688 0         0 $timelocal += $time_day * ($day-1) ;
689            
690 0         0 $timelocal += 60*60 * $hour ;
691 0         0 $timelocal += 60 * $min ;
692 0         0 $timelocal += $sec ;
693            
694 0         0 return $timelocal ;
695             }
696            
697             ################
698             # IS_LEAP_YEAR #
699             ################
700            
701             sub is_leap_year {
702 0     0 0 0 my ( $year ) = @_ ;
703            
704 0 0       0 if ($year == 0) { return 1 ;}
  0 0       0  
    0          
    0          
    0          
705 0         0 elsif (($year % 4000) == 0) { return 0 ;}
706 0         0 elsif (($year % 400) == 0) { return 1 ;}
707 0         0 elsif (($year % 100) == 0) { return 0 ;}
708 0         0 elsif (($year % 4) == 0) { return 1 ;}
709 0         0 return 0 ;
710             }
711            
712             ##############
713             # CHECK_DATE #
714             ##############
715            
716             sub check_date {
717 0 0   0 0 0 shift if $_[0] !~ /^\d+$/ ;
718            
719 0         0 my ( $year , $month , $day ) ;
720            
721 0 0       0 if ($#_ == 2) { ( $year , $month , $day ) = @_ ;}
  0         0  
722 0 0       0 if ($#_ == 1) { ( $month , $day ) = @_ ;}
  0         0  
723 0 0       0 if ($#_ == 0) { ( $month ) = @_ ;}
  0         0  
724            
725 0 0       0 if ($#_ > 0) {
    0          
726 0 0       0 if ($year eq '') { $year = 1970 }
  0         0  
727 0 0       0 if ($month eq '') { $month = 1 }
  0         0  
728 0 0       0 if ($day eq '') { $day = 1 }
  0         0  
729            
730 0         0 my @months_days = @MONTHS_DAYS ;
731            
732 0 0       0 if ( is_leap_year($year) ) { $months_days[2] = 29 ;}
  0         0  
733            
734 0 0       0 if ($day <= $months_days[$month]) { return 1 ;}
  0         0  
735 0         0 else { return ;}
736             }
737             elsif ($#_ == 0) {
738 0 0       0 if ($month eq '') { return ; }
  0         0  
739 0         0 return $MONTHS_DAYS[$month] ;
740             }
741            
742 0         0 return undef ;
743             }
744            
745             ##################
746             # IS_FILE_HIDDEN #
747             ##################
748            
749             sub is_file_hidden {
750 0     0 0 0 my $file = shift ;
751            
752 0         0 my $data_ref = \$_[0] ;
753            
754 0 0       0 if ( -e $file ) {
755 0         0 my $buffer ;
756 0         0 open (FLH,$file) ;
757 0         0 1 while( read(FLH, $buffer , 1024*8 , length($buffer) ) ) ;
758 0         0 close (FLH) ;
759 0         0 $data_ref = \$buffer ;
760             }
761            
762 0 0       0 if ( $$data_ref =~ /(?:^|\r\n?|\n)[ \t]*#[ \t#]*lib:*http[ \t]*=>[ \t]*hidden_?file\s/si ) {
763 0         0 return 1 ;
764             }
765            
766 0         0 return ;
767             }
768            
769             ##################
770             # UNLINK_TMPFILE #
771             ##################
772            
773             sub unlink_tmpfile {
774 1     1 0 3 close TMPFILE ;
775            
776 1 50       4 if ( $_[0] ) {
777 1         8 open (TMPFILE,">$TMPFILE") ;
778 1         3 print TMPFILE "\n" ;
779 1         2 close (TMPFILE) ;
780             }
781            
782 1         9 unlink $TMPFILE ;
783             ##print "UNLINK TMPFILE: $TMPFILE [". $INC{'BotCore.pm'} ."]\n" ;
784             ##
785             }
786            
787             ##########
788             # TMPDIR #
789             ##########
790            
791             sub tmpdir {
792            
793 0     0 0 0 my @dir_list = (
794             @ENV{qw(TMPDIR TEMP TMP)},
795             qw(
796             C:/temp
797             C:/tmp
798             SYS:/temp
799             SYS:/tmp
800             /tmp
801             /
802             ),
803             ) ;
804            
805 0         0 my $tmpdir ;
806 0         0 foreach my $dir_list_i ( @dir_list ) {
807 0 0       0 next if !$dir_list_i ;
808 0 0 0     0 if ( -d $dir_list_i && -w $dir_list_i && -r $dir_list_i ) {
      0        
809 0         0 $tmpdir = $dir_list_i ;
810 0         0 last ;
811             }
812             }
813            
814 0 0 0     0 if ( !$tmpdir && -w '.' ) {
815 0         0 my @lyb = (a..z,0..9) ;
816 0         0 my $rand ;
817 0         0 $rand .= $lyb[ rand(@lyb) ] while length($rand) < 6 ;
818 0         0 my $dir = "./$rand-tmp" ;
819 0         0 mkdir($dir , 0777) ;
820 0 0 0     0 $tmpdir = $dir if -d $dir && -w $dir ;
821             }
822            
823 0         0 return $tmpdir ;
824             }
825            
826             ##########
827             # MKPATH #
828             ##########
829            
830             sub mkpath {
831 0     0 0 0 my ( $path ) = @_ ;
832            
833 0         0 my @path = split(/[\\\/]/ , $path) ;
834            
835 0         0 my $path ;
836            
837 0 0       0 if ( $path[0] =~ /^\w+:$/ ) {
838 0         0 $path .= shift(@path) . '/' ;
839             }
840            
841 0         0 foreach my $path_i ( @path ) {
842 0         0 $path .= $path_i . '/' ;
843 0 0       0 next if -e $path ;
844 0         0 mkdir($path , 0777) ;
845             }
846            
847 0         0 return 1 ;
848             }
849            
850             ##########
851             # RMTREE #
852             ##########
853            
854             sub rmtree {
855 0     0 0 0 my ( $path ) = @_ ;
856            
857 0         0 my @subdirs = scandir($path) ;
858            
859 0         0 my $main = $subdirs[0] ;
860            
861 0         0 foreach my $subdirs_i ( reverse @subdirs ) {
862 0         0 opendir (my $DH, $subdirs_i);
863            
864 0         0 while (my $filename = readdir $DH) {
865 0 0 0     0 if ($filename ne '.' && $filename ne '..') {
866 0         0 my $file = "$subdirs_i/$filename" ;
867 0 0       0 next if -d $file ;
868 0         0 unlink($file) ;
869             }
870             }
871            
872 0         0 closedir ($DH) ;
873            
874 0         0 rmdir($subdirs_i) ;
875             }
876            
877 0         0 return 1 ;
878             }
879            
880             #######
881             # END #
882             #######
883            
884             sub end {
885 1     1 0 4 unlink_tmpfile(1) ;
886            
887 1         3 foreach my $TMPDIRS_i ( @TMPDIRS ) {
888 0 0       0 print ">> UNLINK> $TMPDIRS_i\n" if $DEBUG ;
889 0         0 rmtree($TMPDIRS_i) ;
890             }
891            
892 1         6 exit ;
893             }
894            
895 1     1   208 sub END { &end ;}
896            
897             #######
898             # END #
899             #######
900            
901             1;
902            
903             __END__