cachetrace.pl
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:1k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. require 'sys/socket.ph';
  3. $url = shift || die "usage: $0: urln";
  4. $proxy = 'localhost';
  5. $port = 3128;
  6. $url = "http://$url/" if ($url =~ /^[-w.]+$/);
  7. print "Querying cache path to $urln";
  8. $host = $1 if ($url =~ /^[^:]+://([^/:]+)/);
  9. $sockaddr = 'S n a4 x8';
  10. ($name, $aliases, $proto) = getprotobyname("tcp");
  11. ($fqdn, $aliases, $type, $len, $thataddr) = gethostbyname($proxy);
  12. $thissock = pack($sockaddr, &AF_INET, 0, "");
  13. $that = pack($sockaddr, &AF_INET, $port, $thataddr);
  14. &try_http_11($url);
  15. sub try_http_11 {
  16. local($url) = @_;
  17. local($path) = undef;
  18. $source = $1 if ($url =~ /^[^:]+://([^:/]+)/);
  19. die "socket: $!n" unless
  20.                 socket (SOCK, &AF_INET, &SOCK_STREAM, $proto);
  21.         die "bind: $!n" unless
  22.                 bind (SOCK, $thissock);
  23.         die "$proxy:$port: $!n" unless
  24.                 connect (SOCK, $that);
  25.         select (SOCK); $| = 1;
  26.         select (STDOUT);
  27. print SOCK "TRACE $url HTTP/1.1rnHost: $hostrnAccept: */*rnrn";
  28. while (<SOCK>) {
  29. s/r//g;
  30. s/n//g;
  31. $code = $1 if (/^HTTP/d.d (d+)/);
  32. $server = $1 if (/^Server:s*(.*)$/);
  33. $path = $1 if (/^Via:s*(.*)$/);
  34. }
  35. return 0 unless ($path && $code == 200);
  36. print "Received TRACE reply from $sourcen";
  37. @F = split(',', $path);
  38. $i = 0;
  39. foreach $n (@F) {
  40. $n =~ s/^s+//;
  41. printf " %2d   %sn", ++$i, $n;
  42. }
  43. printf " %2d   %s (%s)n", ++$i, $source, $server;
  44. 1;
  45. }