アドビのAcrobat用バイトサービングスクリプトが何をやっているか今ならわかる
スポンサードリンク
AcrobatでWebからページごとのデータを分割して取得できるよう、サーバがHTTP/1.1のRangeに対応していない場合代わりにUAからの要求範囲を受け取ってPerlでPDFの特定部位を切り出して返すリダイレクトCGIなんですね。
http://www.adobe.com/jp/products/acrobat4/library/scripts/bsunix.txt
(2013-05-25 10:26追記)
上記URLはリンク切れなので、Weyback Archiveのリンクと、転記をしておきます。それにしてもアドビの人は、後世に伝えることに関して無関心すぎる。
#!/usr/bin/perl
#!/usr/local/bin/perl
# byteserver script
# byteserver.pl
# Last updated May 10, 1996
# This script implements the draft "Byte Range Retrieval Extension to HTTP" described at
# "http://www.w3.org/Protocols/rfc2068/rfc2068".
# place this script wherever you can run CGIs on your Web server.
# 1) Users should make sure that the script as placed in the cgi-bin
#directory is renamed to byteserver.pl, and has execute permission on
#a UNIX machine. This is done by typing: chmod 755 byteserver.pl
#2.) The first line of the byteserver.pl script contains a line of the form
#!<pathname>
#where <pathname> points to
#where perl is found on the system.
#Users should modify this line to suit their system-- on a UNIX machine
#you can find out where perl resides by typing: which perl
#if the above returns /usr/local/bin/perl
#then the first line of the byteserver.pl should read
#!/usr/local/bin/perl
#Note: if executing the command: which perl
#returns the message: perl command not found or something similar it
#means that perl is not installed on your system. You *need* perl to
#use byteserver.pl
# query is of the form
# http://server/cgi-bin/byteserver.pl/path/name/here
# with HTTP_RANGE specifying the ranges in the form
# "bytes=m1-n1,m2-n2,...,mn-nn"
# /path/name/here is relative to server root
# m-n are ranges (0 based). If m is absent, means n bytes from EOF, if n
# is absent, mean first m bytes of the file
# "bytes=..." syntax
# STDOUT the ranges
# The script issues HTTP1.0 206 Partial Content as a partial
# content response.
# Env. variables:
# PATH_TRANSLATED is the file name
# CONTENT_TYPE is what the server says is the mime type of file
# REQUEST_METHOD is the request method i.e. GET, POST etc. (we only accept GET)
# HTTP_RANGE the byte range request
# Return syntax:
# if no ;bytes= is specified, returns:
# Accept-ranges: bytes
# Content-type: <content-type>
# Content-length: <file-length>
# <the file itself>
# if ;bytes= specified, returns:
#
# HTTP/1.0 206 Partial Content
# Accept-ranges: bytes
# Content-type: multipart/x-byteranges; boundary=$boundary
# < multipart-body >
sub badjob {
local($mesg) = @_;
print "Status: 403 \"BOGUS\"\r\n\r\n";
print "<HEAD><TITLE>403 BOGUS</TITLE></HEAD>"; print "<BODY BGCOLOR="#FFFFFF" LINK="#0033CC" VLINK="#800080" ALINK="#FF0000"><H1>403 BOGUS</H1>";
print "<pre>$mesg</pre>\r\n";
print "Bad Request\r\n\r\n";
exit 1;
}
$path = $ENV{'PATH_TRANSLATED'};
$ranges = $ENV{'HTTP_RANGE'};
($file, $query) = split(/;/,$path);
$contenttype = $ENV{'CONTENT_TYPE'};
if ($contenttype eq "")
{
$contenttype = "application/pdf";
}
if ((! -r $file) || (length $file <= 3))
{
&badjob("file $file not found");
}
if ($ENV{'REQUEST_METHOD'} ne 'GET')
{ # not URL-based query
&badjob("METHOD not GET");
}
$size = -s $file;
if (($query eq "") && ($ranges eq ""))
{
# respond that we can do ranges
print "Accept-ranges: bytes\r\n";
print "Content-type: $contenttype\r\n";
printf "Content-Length: %d\r\n\r\n", $size;
open(FILE, "< $file");
while(read(FILE, $buffer, 4096)) {
print STDOUT $buffer;
}
exit 0;
} else {
if ($ranges ne "")
{
$query = $ranges;
$query =~ s/bytes=//;
}
else
{
$query =~ s/\s+//g; # squeeze all whitespace out
$query =~ s/bytes=//;
}
#check that the ranges are properly formatted
@byterangeCheck = split(/[-,=]/,$query);
while (defined($fbyte = shift(@byterangeCheck))) {
$lbyte = shift(byterangeCheck);
if (($fbyte > 0) && ($lbyte < 0)) {
&badjob("query range malformed");
}
if (($fbyte < 0) && ($lbyte > 0)) {
&badjob("query range malformed");
}
if ($fbyte > $lbyte) {
&badjob("query range malformed");
}
}
@byterange = split(/[,]/,$query);
}
# print 206 only if called with official syntax
if ( $ranges ne "" )
{
print "Status: 206 Partial Content\r\n";
}
# print other header info
$boundary="multipart-boundary";
print "Accept-ranges: bytes\r\n";
print "Content-type: multipart/x-byteranges; boundary=$boundary\r\n\r\n";
# Serve up the bytes:
open(FILE, "< $file");
while (defined ($range = shift(@byterange))) {
($fbyte, $lbyte) = split('-', $range);
$i = index($range,"-");
if ($i == 0) { $fbyte = -1; }
if ($fbyte < 0) {
$fbyte = $size - $lbyte;
$lbyte = $size;
}
$nbytes = $lbyte - $fbyte + 1;
print "\r\n--$boundary\r\n";
print "Content-type: $contenttype\r\n";
printf "Content-Range: bytes %d-%d/%d\r\n\r\n", $fbyte, $lbyte, $size;
seek(FILE, $fbyte, 0);
read(FILE, $buffer, $nbytes);
print STDOUT $buffer;
}
print "\r\n--$boundary--\r\n";
exit 0;
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3021





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)

コメントする