ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/myhttpd/access.pl
Revision: 1.18
Committed: Sat Dec 1 01:37:24 2001 UTC (22 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.17: +9 -17 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 package transferqueue;
2
3 sub new {
4 my $class = shift;
5 bless {
6 conns => $_[0],
7 }, $class;
8 }
9
10 sub start_transfer {
11 my $self = shift;
12
13 my $trans = bless [ $self ], transfer::;
14
15 push @{$self->{wait}}, $trans;
16 Scalar::Util::weaken($self->{wait}[-1]);
17
18 if (--$self->{conns} >= 0) {
19 $self->wake_next;
20 }
21
22 $trans;
23 }
24
25 sub wake_next {
26 my $self = shift;
27
28 while(@{$self->{wait}}) {
29 my $transfer = shift @{$self->{wait}};
30 if ($transfer) {
31 $transfer->wake;
32 last;
33 }
34 }
35 }
36
37 sub waiters {
38 map $_->[1], @{$_[0]{wait}};
39 }
40
41 package transfer;
42
43 use Coro::Timer ();
44
45 sub wake {
46 my $self = shift;
47 $self->[2] = 1;
48 ref $self->[1] and $self->[1]->ready;
49 }
50
51 sub try {
52 my $self = shift;
53
54 unless ($self->[2]) {
55 my $timeout = Coro::Timer::timeout $_[0];
56 local $self->[1] = $Coro::current;
57
58 Coro::schedule;
59 }
60
61 return $self->[2];
62 }
63
64 sub DESTROY {
65 my $self = shift;
66 $self->[0]{conns}++;
67 $self->[0]->wake_next if $self->[2];
68 }
69
70 package conn;
71
72 our %blockuri;
73 our $blockref;
74
75 sub read_blockuri {
76 local *B;
77 my %group;
78 %blockuri = ();
79 if (open B, "<blockuri") {
80 while (<B>) {
81 chomp;
82 if (/^group\s+(\S+)\s+(.*)/i) {
83 $group{$1} = [split /\s+/, $2];
84 } elsif (/^!([^\t]*)\t\s*(.*)/) {
85 my $g = $1;
86 my @r;
87 for (split /\s+/, $2) {
88 push @r, $group{$_} ? @{$group{$_}} : $_;
89 }
90 print "not($g) => (@r)\n";
91 push @{$blockuri{$_}}, $g for @r;
92 push @blockuri, [qr/$g/i, \@r];
93 } elsif (/\S/) {
94 print "blockuri: unparsable line: $_\n";
95 }
96 }
97 for (keys %blockuri) {
98 my $qr = join ")|(?:", @{$blockuri{$_}};
99 $blockuri{$_} = qr{(?:$qr)}i;
100 }
101 } else {
102 print "no blockuri\n";
103 }
104 }
105
106 sub read_blockref {
107 local *B;
108 my @blockref;
109 if (open B, "<blockreferer") {
110 while (<B>) {
111 chomp;
112 if (/^([^\t]*)\t\s*(.*)/) {
113 push @blockref, $1;
114 } elsif (/\S/) {
115 print "blockref: unparsable line: $_\n";
116 }
117 }
118 $blockref = join ")|(?:", @blockref;
119 $blockref = qr{^(?:$blockref)}i;
120 } else {
121 print "no blockref\n";
122 $blockref = qr{^x^};
123 }
124 }
125
126 read_blockuri;
127 read_blockref;
128
129 use Tie::Cache;
130 tie %whois_cache, Tie::Cache::, 32;
131
132 sub access_check {
133 my $self = shift;
134
135 my $ref = $self->{h}{referer};
136 my $uri = $self->{path};
137 my %disallow;
138
139 $self->err_block_referer
140 if $self->{h}{referer} =~ $blockref;
141
142 my $whois = $whois_cache{$self->{remote_addr}}
143 ||= netgeo::ip_request($self->{remote_addr});
144
145 my $country = "XX";
146
147 if ($whois =~ /^\*cy: (\S+)/m) {
148 $country = uc $1;
149 } else {
150 $self->slog(9, "no country($whois)");
151 }
152
153 $self->{country} = $country;
154
155 $self->err_block_country($whois)
156 if $self->{path} =~ $blockuri{$country};
157 }
158
159 1;