ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/myhttpd/access.pl
(Generate patch)

Comparing Coro/myhttpd/access.pl (file contents):
Revision 1.7 by root, Mon Aug 20 16:58:19 2001 UTC vs.
Revision 1.24 by root, Tue Dec 4 02:46:29 2001 UTC

1package transferqueue;
1 2
3my @reserve = (
4 [ 1_000_000, 1],
5 [ 10_000_000, 1],
6);
7
8sub new {
9 my $class = shift;
10 bless {
11 slots => $_[0],
12 lastspb => 0,
13 avgspb => 0,
14 }, $class;
15}
16
17sub start_transfer {
18 my $self = shift;
19 my $size = $_[0];
20
21 my $transfer = bless {
22 queue => $self,
23 time => $::NOW,
24 size => $size,
25 coro => $Coro::current,
26 started => 0,
27 }, transfer::;
28
29 push @{$self->{wait}}, $transfer;
30
31 $self->wake_next;
32
33 $transfer;
34}
35
36sub sort {
37 my @queue = grep $_, @{$_[0]{wait}};
38
39 $_->{spb} = ($::NOW-$_->{time}) / ($_->{size} || 1) for @queue;
40
41 $_[0]{wait} = [sort { $b->{spb} <=> $a->{spb} } @queue];
42
43 Scalar::Util::weaken $_ for @{$_[0]{wait}};
44}
45
46sub wake_next {
47 my $self = shift;
48
49 $self->sort;
50
51 while (@{$self->{wait}}) {
52 my $size = $self->{wait}[0]{size};
53 my $min = 0;
54 for (@reserve) {
55 last if $size <= $_->[0];
56 $min += $_->[1];
57 }
58 last unless $self->{slots} > $min;
59 my $transfer = shift @{$self->{wait}};
60 $self->{lastspb} = $transfer->{spb};
61 $self->{avgspb} ||= $transfer->{spb};
62 $self->{avgspb} = $self->{avgspb} * 0.95 + $transfer->{spb} * 0.05;
63 $self->{started}++;
64 $transfer->wake;
65 last;
66 }
67}
68
69sub waiters {
70 $_[0]->sort;
71 @{$_[0]{wait}};
72}
73
74package transfer;
75
76use Coro::Timer ();
77
78sub wake {
79 my $self = shift;
80
81 $self->{alloc} = 1;
82 $self->{queue}{slots}--;
83 $self->{wake} and $self->{wake}->ready;
84}
85
86sub try {
87 my $self = shift;
88
89 $self->{alloc} || do {
90 my $timeout = Coro::Timer::timeout $_[0];
91 local $self->{wake} = $self->{coro};
92
93 Coro::schedule;
94
95 $self->{alloc};
96 }
97}
98
99sub DESTROY {
100 my $self = shift;
101
102 if ($self->{alloc}) {
103 $self->{queue}{slots}++;
104 $self->{queue}->wake_next;
105 }
106}
107
108package conn;
109
2our @blockuri; 110our %blockuri;
3our @blockref; 111our $blockref;
4 112
5sub read_blockuri { 113sub read_blockuri {
6 local *B; 114 local *B;
7 my %group; 115 my %group;
8 @blockuri = (); 116 %blockuri = ();
9 if (open B, "<blockuri") { 117 if (open B, "<blockuri") {
10 while (<B>) { 118 while (<B>) {
11 chomp; 119 chomp;
12 if (/^group\s+(\S+)\s+(.*)/i) { 120 if (/^group\s+(\S+)\s+(.*)/i) {
13 $group{$1} = [split /\s+/, $2]; 121 $group{$1} = [split /\s+/, $2];
16 my @r; 124 my @r;
17 for (split /\s+/, $2) { 125 for (split /\s+/, $2) {
18 push @r, $group{$_} ? @{$group{$_}} : $_; 126 push @r, $group{$_} ? @{$group{$_}} : $_;
19 } 127 }
20 print "not($g) => (@r)\n"; 128 print "not($g) => (@r)\n";
129 push @{$blockuri{$_}}, $g for @r;
21 push @blockuri, [qr/$g/i, \@r]; 130 push @blockuri, [qr/$g/i, \@r];
22 } elsif (/\S/) { 131 } elsif (/\S/) {
23 print "blockuri: unparsable line: $_\n"; 132 print "blockuri: unparsable line: $_\n";
24 } 133 }
134 }
135 for (keys %blockuri) {
136 my $qr = join ")|(?:", @{$blockuri{$_}};
137 $blockuri{$_} = qr{(?:$qr)}i;
25 } 138 }
26 } else { 139 } else {
27 print "no blockuri\n"; 140 print "no blockuri\n";
28 } 141 }
29} 142}
30 143
31sub read_blockref { 144sub read_blockref {
32 local *B; 145 local *B;
33 @blockref = (); 146 my @blockref;
34 if (open B, "<blockreferer") { 147 if (open B, "<blockreferer") {
35 while (<B>) { 148 while (<B>) {
36 chomp; 149 chomp;
37 if (/^([^\t]*)\t\s*(.*)/) { 150 if (/^([^\t]*)\t\s*(.*)/) {
38 push @blockref, qr/^$1/i; 151 push @blockref, $1;
39 } elsif (/\S/) { 152 } elsif (/\S/) {
40 print "blockref: unparsable line: $_\n"; 153 print "blockref: unparsable line: $_\n";
41 } 154 }
42 } 155 }
156 $blockref = join ")|(?:", @blockref;
157 $blockref = qr{^(?:$blockref)}i;
43 } else { 158 } else {
44 print "no blockref\n"; 159 print "no blockref\n";
160 $blockref = qr{^x^};
45 } 161 }
46} 162}
47 163
48read_blockuri; 164read_blockuri;
49read_blockref; 165read_blockref;
50 166
51use Tie::Cache; 167use Tie::Cache;
52tie %whois_cache, Tie::Cache::, $MAX_CONNECTS * 1.5; 168tie %whois_cache, Tie::Cache::, 32;
53 169
54sub conn::err_block_country {
55 my $self = shift;
56 my $whois = shift;
57
58 $whois =~ s/&/&amp;/g;
59 $whois =~ s/</&lt;/g;
60 $self->err(403, "forbidden", { "Content-Type" => "text/html", Connection => "close" }, <<EOF);
61<html>
62<head>
63<title>This material is licensed in your country!</title>
64</head>
65<body bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#000080" alink="#ff0000">
66
67<h1>This material is licensed in your country!</h1>
68
69<p>My research has shown that your IP address
70(<b>$self->{remote_addr}</b>) most probably is located in this country:
71<b>$self->{country}</b> (ISO-3166-2 code, XX == unknown). The full record is:</p>
72
73<pre>
74$whois
75</pre>
76
77<p>My database says that the material you are trying to access is licensed
78in your country. If I would distribute these files to your country I would
79actively <em>hurt</em> the industry behind it, which includes the artists
80and authors of these videos/mangas. So I hope you understand that I try to
81avoid this.</p>
82
83<p>Please see the <a href="http://www.goof.com/pcg/marc/animefaq.html#licensed">FAQ</a>
84for a more thorough explanation.</p>
85
86<p>If you <em>really</em> think that this is wrong, i.e. the
87material you tried to access is <em>not</em> licensed in your
88country or your ip address was misdetected, you can write to <a
89href="mailto:licensed\@plan9.de">licensed\@plan9.de</a>. Please explain
90what happened and why you think this is wrong in as much detail as
91possible.</p>
92
93<div align="right">Thanks a lot for understanding.</div>
94
95</body>
96</html>
97EOF
98}
99
100sub conn::err_block_referer {
101 my $self = shift;
102
103 my $uri = $self->{uri};
104 $uri =~ s/\/[^\/]+$/\//;
105
106 $self->slog(6, "REFERER($self->{uri},$self->{h}{referer})");
107
108 $whois =~ s/&/&amp;/g;
109 $whois =~ s/</&lt;/g;
110 $self->err(203, "non-authoritative", { "Content-Type" => "text/html" }, <<EOF);
111<html>
112<head>
113<title>Unallowed Referral</title>
114</head>
115<body bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#000080" alink="#ff0000">
116
117<h1>The site which referred you has done something bad!</h1>
118
119<p>It seems that you are coming from this URL:</p>
120
121<pre>$self->{h}{referer}</pre>
122
123<p>This site has been blocked, either because it required you to pay
124money, forced you to click on banners, claimed these files were theirs
125or something very similar. Please note that you can download these files
126<em>without</em> having to pay, <em>without</em> clicking banners or jump
127through other hoops.</p>
128
129<p><b>Sites like the one you came from actively hurt the distribution of
130these files and the service quality for you since I can't move or correct
131files and you will likely not be able to see the full archive.</b></p>
132
133<p>Having that this, you can find the original content (if it is still
134there) by <b>following <a href="$uri">this link</a>.</b></p>
135
136<div align="right">Thanks a lot for understanding.</div>
137
138</body>
139</html>
140EOF
141}
142
143sub conn::access_check { 170sub access_check {
144 my $self = shift; 171 my $self = shift;
145 172
146 my $ref = $self->{h}{referer}; 173 my $ref = $self->{h}{referer};
147 my $uri = $self->{path}; 174 my $uri = $self->{path};
148 my %disallow; 175 my %disallow;
149 176
150 for (@blockref) {
151 $self->err_block_referer if $ref =~ $_; 177 $self->err_block_referer
152 } 178 if $self->{h}{referer} =~ $blockref;
153 179
154 for (@blockuri) {
155 if ($uri =~ $_->[0]) {
156 $disallow{$_}++ for @{$_->[1]};
157 }
158 }
159
160 my $whois = $whois_cache{$self->{remote_addr}} 180 my $whois = $whois_cache{$self->{remote_addr}}
161 ||= ::ip_request($self->{remote_addr}); 181 ||= netgeo::ip_request($self->{remote_addr});
162 182
163 my $country = "XX"; 183 my $country = "XX";
164 184
165 if ($whois =~ /^\*cy: (\S+)/m) { 185 if ($whois =~ /^\*cy: (\S+)/m) {
166 $country = uc $1; 186 $country = uc $1;
168 $self->slog(9, "no country($whois)"); 188 $self->slog(9, "no country($whois)");
169 } 189 }
170 190
171 $self->{country} = $country; 191 $self->{country} = $country;
172 192
173 if ($disallow{$country}) {
174 $self->err_block_country($whois); 193 $self->err_block_country($whois)
175 } 194 if $self->{path} =~ $blockuri{$country};
176} 195}
177 196
1781; 1971;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines