--- deliantra/server/ext/tcp_http.ext 2012/11/12 01:06:38 1.14 +++ deliantra/server/ext/tcp_http.ext 2017/01/11 15:13:45 1.17 @@ -39,17 +39,23 @@ . "$_[3]\015\012" . ($_[0]{give_head} ? "" : $_[2])); } -my $cache_headers = "cache-control: max-age=8640000\015\012" +my $cache_headers = "cache-control: public, max-age=8640000\015\012" . "etag: \"0\"\015\012"; -sub content_type { - return "content-type: image/png\015\012" if $_[0] =~ /^\x89PNG/; - return "content-type: image/jpeg\015\012" if $_[0] =~ /^......JFIF/s; - return "content-type: audio/wav\015\012" if $_[0] =~ /^RIFF/; - return "content-type: audio/ogg\015\012" if $_[0] =~ /^OggS/; - return "content-type: text/html\015\012" if $_[0] =~ /^respond ("200 OK", $meta, "content-type: text/plain\015\012" . $cache_headers); + $self->respond ("200 OK", $meta, "content-type: text/plain; charset=utf-8\015\012" . $cache_headers); } else { $self->respond ("404 type $type has no metadata"); } } else { - $self->respond ("200 OK", $data, (content_type $data) . $cache_headers); + $self->respond ("200 OK", $data, (content_type $uri, $data) . $cache_headers); } } elsif (my $idx = (cf::face::find "res/http$uri") || (cf::face::find "res/http${uri}index.html")) { - # TODO: use etag (shudder) - my $data = cf::face::get_data $idx; - $self->respond ("200 OK", $data, (content_type $data) . $cache_headers); + my $data = cf::face::get_data $idx; + my $csum = unpack "H*", cf::face::get_csum $idx; + my $hdr = "etag: \"$csum\"\015\012" . $revalidate_headers; + + if ($req =~ /if-none-match: "$csum"/i) { # dirtiest hack evar + $self->respond ("304 not modified", "", $hdr); + next; + } + + $self->respond ("200 OK", $data, (content_type $uri, $data) . $hdr); } elsif (cf::face::find "res/http$uri/index.html") { - $self->respond ("302 dirslash", "", "location: $uri/\015\012"); + $self->respond ("302 dirslash", "", "location: $uri/\015\012" . $nocache_headers); } elsif ($uri eq "/debug") { # for debugging my @body = <respond ("200 OK", $body, "content-type: text/html\015\012"); + $self->respond ("200 OK", $body, "content-type: text/html; charset=utf-8\015\012"); } else { $self->respond ("404 not found");