< draft-ietf-urn-ietf-05.txt   draft-ietf-urn-ietf-06.txt >
Internet-Draft Ryan Moats Internet-Draft Ryan Moats
draft-ietf-urn-ietf-05.txt AT&T draft-ietf-urn-ietf-06.txt AT&T
Expires in six months May 1998 Expires in six months June 1998
A URN Namespace for IETF Documents A URN Namespace for IETF Documents
Filename: draft-ietf-urn-ietf-05.txt Filename: draft-ietf-urn-ietf-06.txt
Status of This Memo Status of This Memo
This document is an Internet-Draft. Internet-Drafts are working This document is an Internet-Draft. Internet-Drafts are working
documents of the Internet Engineering Task Force (IETF), its documents of the Internet Engineering Task Force (IETF), its
areas, and its working groups. Note that other groups may also areas, and its working groups. Note that other groups may also
distribute working documents as Internet-Drafts. distribute working documents as Internet-Drafts.
Internet-Drafts are draft documents valid for a maximum of six Internet-Drafts are draft documents valid for a maximum of six
months and may be updated, replaced, or obsoleted by other months and may be updated, replaced, or obsoleted by other
documents at any time. It is inappropriate to use Internet- documents at any time. It is inappropriate to use Internet-
Drafts as reference material or to cite them other than as ``work Drafts as reference material or to cite them other than as ``work
in progress.'' in progress.''
To view the entire list of current Internet-Drafts, please check To learn the current status of any Internet-Draft, please check
the "1id-abstracts.txt" listing contained in the Internet-Drafts the ``1id-abstracts.txt'' listing contained in the Internet-
Shadow Directories on ftp.is.co.za (Africa), ftp.nordu.net Drafts Shadow Directories on ftp.is.co.za (Africa), nic.nordu.net
(Northern Europe), ftp.nis.garr.it (Southern Europe), munnari.oz.au (Europe), munnari.oz.au (Pacific Rim), ds.internic.net (US East
(Pacific Rim), ftp.ietf.org (US East Coast), or ftp.isi.edu Coast), or ftp.isi.edu (US West Coast).
(US West Coast).
Abstract Abstract
A system for Uniform Resource Names (URNs) must be capable of A system for Uniform Resource Names (URNs) must be capable of
supporting new naming systems. As an example of proposing a new supporting new naming systems. As an example of proposing a new
namespace, this document proposes the "ietf" namespace. This namespace, this document proposes the 'ietf' namespace. This
namespace consists of the RFC family of documents (RFCs, STDs, FYIs, namespace consists of the RFC family of documents (RFCs, STDs, FYIs,
and BCPs) developed by the IETF and published by the RFC editor and and BCPs) developed by the IETF and published by the RFC editor and
the minutes of working groups (WG) and birds of a feather (BOF) the minutes of working groups (WG) and birds of a feather (BOF)
meetings that occur during IETF conferences. Both the current URN meetings that occur during IETF conferences. Both the current URN
framework and URN syntax support this namespace. framework and URN syntax support this namespace.
0.1 Changes from -02 0.1 Changes from -02
This document has been restructured to use the template proposed in This document has been restructured to use the template proposed in
draft-ietf-urn-nid-req-03.txt. Example Perl scripts for resolving draft-ietf-urn-nid-req-03.txt. Example Perl scripts for resolving
skipping to change at page 2, line 17 skipping to change at page 2, line 17
Text was added to the template clarifying persistence and uniqueness. Text was added to the template clarifying persistence and uniqueness.
Support for the BCP document series added to the examples and the Support for the BCP document series added to the examples and the
ABNF. ABNF.
0.3 Changes from -04 0.3 Changes from -04
More clarifications for the persistence section. In addition, More clarifications for the persistence section. In addition,
cleaned up some typos and ensured that the Appendix examples are cleaned up some typos and ensured that the Appendix examples are
functional functional
0.4 Changes from -05
Based on a number of requests, i-ds have been added to the structure
and resolvers. In addition, some examples have been added.
1. Introduction 1. Introduction
This document proposes the "ietf" namespace, which consists of the This document proposes the "ietf" namespace, which consists of the
RFC family of documents (RFCs, STDs, FYIs, and BCPs) developed by the RFC family of documents (RFCs, STDs, FYIs, and BCPs) developed by the
IETF and published by the RFC editor and the minutes of working IETF and published by the RFC editor and the minutes of working
groups (WG) and birds of a feather (BOF) meetings that occur during groups (WG) and birds of a feather (BOF) meetings that occur during
IETF conferences. IETF conferences.
The namespace specification is for a formal namespace. The namespace specification is for a formal namespace.
2. Specification Template 2. Specification Template
Namespace ID: Namespace ID:
"ietf" requested. "ietf" requested.
Declared registrant of the namespace: Declared registrant of the namespace:
Ryan Moats Ryan Moats
jayhawk@att.com jayhawk@att.com
Declaration of structure: Declaration of structure:
The identifier has the following ABNF [2] specification: The identifier has the following ABNF [2] specification:
NSS = (family ":" number) / ("mtg-" number "-" wgbofname) NSS = (family ":" number) / ("mtg-" number "-" wgbofname)
family = "rfc" / "std" / "fyi" / "bcp" ( "id:" name)
number = 1*DIGIT family = "rfc" / "std" / "fyi" / "bcp"
wgbofname = 1*LETDIGIT number = 1*DIGIT
LETDIGIT = DIGIT / %x41-%x5a / %x61-%x7a wgbofname = 1*LETDIGIT
DIGIT = %x30-%x39 name = id draft designation with "draft-" and trailing
type removed (e.g. ietf-urn-ietf-06)
LETDIGIT = DIGIT / %x41-%x5a / %x61-%x7a
DIGIT = %x30-%x39
If the IESG (or it successor) adds a new document If the IESG (or it successor) adds a new document
series, this ABNF specification will need to be series, this ABNF specification will need to be
updated. Further, if a working group or BOF is updated. Further, if a working group or BOF is
created that used characters outside the range of this created that used characters outside the range of this
ABNF specification, this specification will need to be ABNF specification, this specification will need to be
updated. Any system intended to resolve names for updated. Any system intended to resolve names for
this namespace should be written with the awareness this namespace should be written with the awareness
that this could occur at any time. that this could occur at any time.
Identifier uniqueness considerations: Identifier uniqueness considerations:
Because the rfc-editor assigns the RFC number uniquely Because the rfc-editor assigns the RFC number uniquely
these URNs are unique. Since the mapping between RFCs these URNs are unique. Since the mapping between RFCs
and other rfc-editor document series (STDs, FYIs or and other rfc-editor document series (STDs, FYIs or
BCPs) is not necessarily one-to-one, uniqueness of BCPs) is not necessarily one-to-one, uniqueness of
STDs, FYIs and BCPs are defined based on the document STDs, FYIs and BCPs are defined based on the document
mappings maintained by the RFC Editor (the index files mappings maintained by the RFC Editor (the index files
"rfc-index.txt", "fyi-index.txt", "bcp-index.txt" and "rfc-index.txt", "fyi-index.txt", "bcp-index.txt",
"std-index.txt") are defined to be the definitive "std-index.txt") are defined to be the definitive
statement of the assignment of RFC Family URNs in this statement of the assignment of RFC Family URNs in this
namespace. The meeting minutes portion of the namespace. The meeting minutes portion of the
namespace is guaranteed unique because the URN namespace is guaranteed unique because the URN
includes the sequence number of the IETF conference. includes the sequence number of the IETF conference.
The document mapping maintained by the Internet Drafts
editor ("1id-abstracts.txt") is defined as the
definitive statement of the assignment of URNs for
the internet draft portion of this namespace.
Identifier persistence considerations: Identifier persistence considerations:
Persistence of the URNs of this namespace is Persistence of the URNs of this namespace is
independent of the mutability of the underlying independent of the mutability of the underlying
documents. A URN once assigned will never be documents. A URN once assigned will never be
reassigned to a different resource; the assignment is reassigned to a different resource; the assignment is
persistent and immutable. Distinct from this, the persistent and immutable. Distinct from this, the
resources identified as RFCs are immutable, whereas resources identified as RFCs are immutable, whereas
the other sorts of documents, STDs, FYIs, and BCPs are the other sorts of documents, STDs, FYIs, and BCPs are
not. They may be composites of one or more RFCs and not. They may be composites of one or more RFCs and
the set of RFCs that comprise them may change with the set of RFCs that comprise them may change with
time. It is important to note that this mutability of time. It is important to note that this mutability of
some resources is independent of the immutability of some resources is independent of the immutability of
URN assignment to a resource. URN assignment to a resource.
Process of identifier assignment: Process of identifier assignment:
Assignment of URNs from this namespace occurs in two Assignment of URNs from this namespace occurs in two
ways. The first is when a new RFC, FYI, STD or BCP is ways. The first is when a new RFC, FYI, STD or BCP is
passed by the IESG and published by the RFC passed by the IESG and published by the RFC
Editor. This new document will have a new series Editor. This new document will have a new series
number and will therefore define a new URN. The number and will therefore define a new URN. The
document mappings maintained by the RFC Editor (the document mappings maintained by the RFC Editor (the
index files "rfc-index.txt", "fyi-index.txt", index files "rfc-index.txt", "fyi-index.txt",
"bcp-index.txt" and "std-index.txt") are defined to be "bcp-index.txt" and "std-index.txt") are defined to be
the definitive statement of the assignment of RFC the definitive statement of the assignment of RFC
Family URNs in this namespace. Family URNs in this namespace.
The second way a URN is assigned is when a working The second way a URN is assigned is when a working
group or birds of a feather files meeting minutes as group or birds of a feather files meeting minutes as
part of an IETF conference. The list of minutes part of an IETF conference. The list of minutes
maintained by the IETF for each working group and maintained by the IETF for each working group and
conference in the subtree pointed at by the URL conference in the subtree pointed at by the URL
ftp://ietf.org/ietf/ is considered the definitive ftp://ietf.org/ietf/ is considered the definitive
assignment of URNs for working group or birds of a assignment of URNs for working group or birds of a
feather minutes. feather minutes.
Process of identifier resolution: The third way a URN is assigned is through the
publication of a new internet-draft by the Internet
Draft Editor. This draft will have a distinct name
(and version number) and therefore defined a new URN.
The document mapping maintained by the Internet Drafts
editor ("1id-abstracts.txt") is defined as the
definitive statement of the assignment of URNs for
this portion of the namespace.
A mirrored copy of the underlying documentation is Process of identifier resolution:
required to resolve these URNs. Resolution via
HTTP is accomplished by a set of simple Perl cgi-bin
scripts presented in Appendix A.
Rules for Lexical Equivalence: A mirrored copy of the underlying documentation is
required to resolve these URNs. Resolution via
HTTP is accomplished by a set of simple Perl cgi-bin
scripts presented in Appendix A.
The entire URN is case-insensitive. Rules for Lexical Equivalence:
Conformance with URN Syntax: The entire URN is case-insensitive.
There are no additional characters reserved. Conformance with URN Syntax:
Validation mechanism: There are no additional characters reserved.
None specified. Validation mechanism:
Scope: None specified.
Global. Scope:
3. Security Considerations Global.
3. Examples
The following are examples of URNs that a resolver for this namespace
can resolve:
urn:ietf:rfc:2141
urn:ietf:std:50
urn:ietf:id:ietf-urn-ietf-06.txt
urn:ietf:mtg-41-urn
4. Security Considerations
Because this namespace defines no additional reserved characters, it Because this namespace defines no additional reserved characters, it
does not add any security considerations beyond those inherent from does not add any security considerations beyond those inherent from
the existence of the reserved characters from [1]. Further, none of the existence of the reserved characters from [1]. Further, none of
the reserved characters from [1] are used in the definition of the the reserved characters from [1] are used in the definition of the
NSS. This means that resolvers for this namespace may be considered NSS. This means that resolvers for this namespace may be considered
"secure" in the sense that any escaping of characters in the NSS MUST "secure" in the sense that any escaping of characters in the NSS MUST
result in the resolver indicating that the URN has incorrect syntax. result in the resolver indicating that the URN has incorrect syntax.
4. Acknowledgments 5. Acknowledgments
Thanks to various members of the URN working group for comments on Thanks to various members of the URN working group for comments on
earlier drafts of this document. The work described in this document earlier drafts of this document. The work described in this document
is partially supported by the National Science Foundation, is partially supported by the National Science Foundation,
Cooperative Agreement NCR-9218179. Cooperative Agreement NCR-9218179.
4. References 6. References
Request For Comments (RFC) and Internet Draft documents are available Request For Comments (RFC) and Internet Draft documents are available
from <URL:ftp://ftp.internic.net> and numerous mirror sites. from <URL:ftp://ftp.internic.net> and numerous mirror sites.
[1] R. Moats, "URN Syntax," RFC 2141, May 5, 1997. [1] R. Moats, "URN Syntax," RFC 2141, May 5, 1997.
[2] D. Crocker, P. Overell, "Augmented BNF for Syntax Specifica- [2] D. Crocker, P. Overell, "Augmented BNF for Syntax
tions: ABNF," RFC 2234, November 1997. Specifications: ABNF," RFC 2234, November 1997.
5. Author's Address 7. Author's Address
Ryan Moats Ryan Moats
AT&T AT&T
15621 Drexel Circle 15621 Drexel Circle
Omaha, NE 68135-2358 Omaha, NE 68135-2358
USA USA
Phone: +1 402 894-9456 Phone: +1 402 894-9456
EMail: jayhawk@att.com EMail: jayhawk@att.com
Appendix A. Example Resolution Scripts Appendix A. Example Resolution Scripts
The following scripts are examples that can be used for resolving The following scripts are examples that can be used for resolving
URNs in this namespace. URNs in this namespace.
A.1 I2C A.1 I2C
#!/usr/local/bin/perl #!/usr/local/bin/perl
use strict; use strict;
# #
# this is a URN 2 URC resolver for the ietf namespace # this is a URN 2 URC resolver for the ietf namespace
# #
my(%cite) = ( my(%cite) = (
rfc => "/ftp/rfc/rfc-index.txt", bcp => "/ftp/rfc/bcp-index.txt",
fyi => "/ftp/fyi/fyi-index.txt", fyi => "/ftp/fyi/fyi-index.txt",
std => "/ftp/std/std-index.txt", id => "/ftp/internet-drafts/1id-abstracts.txt",
bcp => "/ftp/rfc/bcp-index.txt" rfc => "/ftp/rfc/rfc-index.txt",
); std => "/ftp/std/std-index.txt"
my(%number2date) = ( );
41 => "98apr", my(%number2date) = (
40 => "97dec", 39 => "97aug", 38 => "97apr", 41 => "98apr",
37 => "96dec", 36 => "96jun", 35 => "96mar", 40 => "97dec", 39 => "97aug", 38 => "97apr",
34 => "95dec", 33 => "95jul", 32 => "95apr", 37 => "96dec", 36 => "96jun", 35 => "96mar",
31 => "94dec", 30 => "94jul", 29 => "94mar", 34 => "95dec", 33 => "95jul", 32 => "95apr",
28 => "93nov", 27 => "93jul", 26 => "93mar", 31 => "94dec", 30 => "94jul", 29 => "94mar",
25 => "92nov", 24 => "92jul", 23 => "92mar", 28 => "93nov", 27 => "93jul", 26 => "93mar",
22 => "91nov", 21 => "91jul", 20 => "91mar", 25 => "92nov", 24 => "92jul", 23 => "92mar",
19 => "90dec" ); 22 => "91nov", 21 => "91jul", 20 => "91mar",
19 => "90dec" );
my($wgpath) = "/ftp/ietf"; my($wgpath) = "/ftp/ietf";
my($urn) = $ENV{'QUERY_STRING'}; my($urn) = $ENV{'QUERY_STRING'};
my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i); (&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(i);
(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(\d*)-(\w*)/i); (&resolverfc($1, $2), exit) if ($urn =~ /urn:ietf:(72)/i);
&urn_error("400 Bad Request\n"); (&resolvemtg($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(9*)-(
120&urn_error("400 Bad Request0);
sub resolvemtg {
my($ietfnum, $sesnam) = @_;
&urn_error("404 Not Found0) if (!defined $number2date{$ietfnum});
my($date)=$number2date{$ietfnum};
my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
if (-f $link) {
print "Status: 200 OK70;
print "Content-type: text/html70;
print "<HTML>0TITLE>Citation for $urn</TITLE>0;
print "<BODY>0;
print "<H1><A HREF=
print "Minutes of the $sesnam working group from the " . &end($ietfnum) . " IETF";
print "</BODY>0/HTML>0;
return;
}
my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
if (-f $link) {
print "Status: 200 OK70;
print "Content-type: text/html70;
print "<HTML>0TITLE>Citation for $urn</TITLE>0;
print "<BODY>0;
print "<H1><A HREF=
print "Minutes of the $sesnam working group from the " . &end($ietfnum) . " IETF";
print "</BODY>0/HTML>0;
return;
}
&urn_error("404 Not Found0);
}
sub resolve2 { sub end {
my($ietfnum, $sesnam) = @_; my($inarg)=@_;
&urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum}); return $inarg . "st" if ($inarg =~ /1$/);
my($date)=$number2date{$ietfnum}; return $inarg . "nd" if ($inarg =~ /2$/);
my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt"; return $inarg . "rd" if ($inarg =~ /3$/);
if (-f $link) { return $inarg . "th";
print "Status: 200 OK\r\n"; }
print "Content-type: text/html\r\n\r\n";
print "<HTML>\n<TITLE>Citation for $urn</TITLE>\n";
print "<BODY>\n";
print "<H1><A HREF=\"$link\">$urn</A>:</H1>\n";
print "Minutes of the $sesnam working group from the " . &end($ietfnum) . " IETF";
print "</BODY>\n</HTML>\n";
return;
}
my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
if (-f $link) {
print "Status: 200 OK\r\n";
print "Content-type: text/html\r\n\r\n";
print "<HTML>\n<TITLE>Citation for $urn</TITLE>\n";
print "<BODY>\n";
print "<H1><A HREF=\"$link\">$urn</A>:</H1>\n";
print "Minutes of the $sesnam working group from the " . &end($ietfnum) . " IETF";
print "</BODY>\n</HTML>\n";
return;
}
&urn_error("404 Not Found\n");
}
sub end { sub resolverfc {
my($inarg)=@_; my($flag,@bib,$i,$k,$j,$done,@ref);
return $inarg . "st" if ($inarg =~ /1$/); my($l,$link);
return $inarg . "nd" if ($inarg =~ /2$/); my($scheme, $value) = @_;
return $inarg . "rd" if ($inarg =~ /3$/); $scheme =~ tr/A-Z/a-z/;
return $inarg . "th"; if (!defined $cite{$scheme}) {
} &urn_error("404 Not Found0);
}
sub resolve1 { $flag = 0;
my($flag,@bib,$i,$k,$j,$done,@ref); open(INPUT, "$cite{$scheme}");
my($l,$link); while (<INPUT>) {
my($scheme, $value) = @_; $flag = 1 if (/^0*$value /);
$scheme =~ tr/A-Z/a-z/; if ($flag == 1) {
if (!defined $cite{$scheme}) { last if (/^$/);
&urn_error("404 Not Found\n"); chop;
} push @bib,$_;
}
}
$flag = 0; if ($scheme ne "rfc") {
open(INPUT, "$cite{$scheme}"); print "Status: 200 OK70;
while (<INPUT>) { print "Content-type: text/html70;
$flag = 1 if (/^0*$value /); $bib[0] =~ s/^[0-9]*/<B>/;
if ($flag == 1) { for ($i=0; $i<=$#bib; $i+=1) {
last if (/^$/); last if ($bib[$i] =~ s/./.</B>/);
chop; }
push @bib,$_; for ($i=0;$i<=$#bib;$i+=1) {
} $k=$bib[$i];
} while ($k =~ /(fyi|std|rfc|bcp)([0-9]+)(.*)/i) {
push @ref,"$1$2";
$k=$3;
}
$done="";
foreach $j (@ref) {
next if ($done =~ $j);
$done .= "$j ";
$l = $j;
$l =~ tr/A-Z/a-z/;
$link=&make_link("$l");
$bib[$i] =~ s/$j/<A HREF="$link">$j</A>/g;
}
}
print "<HTML>0TITLE>Citation for $urn</TITLE>0;
print "<BODY>0;
$link=&make_link("$scheme$value");
print "<H1><A HREF=
foreach $i (@bib) {
print "$i0;
}
print "</BODY>0/HTML>0;
} else {
print "Status: 200 OK70;
print "Content-type: text/html70;
$bib[0] =~ s/^[0-9]*//;
$j=0;
for ($i=0; $i<=$#bib; $i+=1) {
$j += ($bib[$i] =~ s/, "/, <B>"/);
$j += ($bib[$i] =~ s/",/"</B>,/);
if ($scheme ne "rfc") { }
print "Status: 200 OK\r\n"; for ($i=0;$i<=$#bib;$i+=1) {
print "Content-type: text/html\r\n\r\n"; $k=$bib[$i];
$bib[0] =~ s/^[0-9]*\s*/<B>/; while ($k =~ /(fyistdrfc|bcp)([0-9]+)(.*)/i) {
for ($i=0; $i<=$#bib; $i+=1) { push @ref,"$1$2";
last if ($bib[$i] =~ s/\./.<\/B>/); $k=$3;
} }
for ($i=0;$i<=$#bib;$i+=1) { $done="";
$k=$bib[$i]; foreach $j (@ref) {
while ($k =~ /(fyi|std|rfc|bcp)([0-9]+)(.*)/i) { next if ($done =~ $j);
push @ref,"$1$2"; $done .= "$j ";
$k=$3; $l = $j;
} $l =~ s//g;
$done=""; $l =~ tr/A-Z/a-z/;
foreach $j (@ref) { $link=&make_link("$l");
next if ($done =~ $j); $bib[$i] =~ s/$j/<A HREF="$link">$j</A>/g;
$done .= "$j "; }
$l = $j; }
$l =~ tr/A-Z/a-z/; print "<HTML>0TITLE>Citation for $urn</TITLE>0;
$link=&make_link("$l"); print "<BODY>0;
$bib[$i] =~ s/$j/<A HREF="$link">$j<\/A>/g; $link=&make_link("$scheme$value");
} print "<H1><A HREF=
} foreach $i (@bib) {
print "<HTML>\n<TITLE>Citation for $urn</TITLE>\n"; print "$i0;
print "<BODY>\n"; }
$link=&make_link("$scheme$value"); print "</BODY>0/HTML>0;
print "<H1><A HREF=\"$link\">$scheme$value</A>:</H1>\n"; }
foreach $i (@bib) { }
print "$i\n";
}
print "</BODY>\n</HTML>\n";
} else {
print "Status: 200 OK\r\n";
print "Content-type: text/html\r\n\r\n";
$bib[0] =~ s/^[0-9]*\s*//;
$j=0;
for ($i=0; $i<=$#bib; $i+=1) {
$j += ($bib[$i] =~ s/, "/, <B>"/);
$j += ($bib[$i] =~ s/",/"<\/B>,/);
}
for ($i=0;$i<=$#bib;$i+=1) {
$k=$bib[$i];
while ($k =~ /(fyi\s|std\s|rfc|bcp)([0-9]+)(.*)/i) {
push @ref,"$1$2";
$k=$3;
}
$done="";
foreach $j (@ref) {
next if ($done =~ $j);
$done .= "$j ";
$l = $j;
$l =~ s/\s//g;
$l =~ tr/A-Z/a-z/;
$link=&make_link("$l");
$bib[$i] =~ s/$j/<A HREF="$link">$j<\/A>/g;
}
}
print "<HTML>\n<TITLE>Citation for $urn</TITLE>\n";
print "<BODY>\n";
$link=&make_link("$scheme$value");
print "<H1><A HREF=\"$link\">$scheme$value</A>:</H1>\n";
foreach $i (@bib) {
print "$i\n";
}
print "</BODY>\n</HTML>\n";
}
}
sub make_link { sub make_link {
my($sc); my($sc);
my($inarg)=@_; my($inarg)=@_;
($sc=$1) if ($inarg =~ /([a-z]*)/); ($sc=$1) if ($inarg =~ /([a-z]*)/);
return "/$sc/$inarg.ps" if (-e "/ftp/$sc/$inarg.ps"); return "/$sc/$inarg.ps" if (-e "/ftp/$sc/$inarg.ps");
return "/$sc/$inarg.html" if (-e "/ftp/$sc/$inarg.html"); return "/$sc/$inarg.html" if (-e "/ftp/$sc/$inarg.html");
return "/$sc/$inarg.txt"; return "/$sc/$inarg.txt";
} }
sub urn_error { sub urn_error {
my($code) = @_; #store failure code here... my($code) = @_; #store failure code here...
print "Status: $code"; print "Status: $code";
print "Content-type: text/html\n\n<HTML>\n"; print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2C $code</title></head>\n"; print "<head><title>URN Resolution: I2C $code</title></head>0;
print "<BODY>\n"; print "<BODY>0;
print "<h1>URN to URC resolution failed for the URN:</h1>\n"; print "<h1>URN to URC resolution failed for the URN:</h1>0;
print "<hr><h3>$urn</h3>\n"; print "<hr><h3>$urn</h3>0;
print "</body>\n"; print "</body>0;
print "</html>\n"; print "</html>0;
exit; exit;
}; };
sub resolveid {
my($flag,@bib,$i,$k,$j,$count,@ref);
my($l,$link, $hdr, $done);
my($value) = @_;
my($scheme) = "id";
open(INPUT, "$cite{$scheme}");
while (<INPUT>) {
#
# capture record
#
if ($flag == 1 || /^
push @bib,$_;
($hdr = -1, $count = 0, $flag = 1) if (/^
$count++ if (/^/);
}
if ($count == 1) {
$hdr = $#bib if ($hdr == -1);
}
if ($count == 2) {
for ($i=0; $i<=$hdr; $i+=1) {
if ($bib[$i] =~ /<(.*)>/) {
$l = $1;
if ($l eq "draft-$value.txt" || $l eq "draft-$value.ps") {
print "Status: 200 OK70;
print "Content-type: text/html70;
print "<HTML>0TITLE>Citation for $urn</TITLE>0;
print "<BODY>0;
print "<a href=
print "<pre>0;
foreach $i (@bib) {
print "$i";
}
print "</pre>0;
print "</BODY>0/HTML>0;
exit;
}
}
}
$flag = 0;
@bib = ();
}
}
&urn_error("404 Not Found0);
}
A.2 I2L A.2 I2L
#!/usr/local/bin/perl #!/usr/local/bin/perl
use strict; use strict;
# #
# this is a URN 2 URL resolver for the ietf namespace # this is a URN 2 URL resolver for the ietf namespace
# #
my(%pathbase) = ( my(%pathbase) = (
rfc => "rfc/rfc", rfc => "rfc/rfc",
fyi => "fyi/fyi", fyi => "fyi/fyi",
std => "std/std", std => "std/std",
bcp => "bcp/bcp", bcp => "bcp/bcp",
); id => "internet-drafts/draft-",
);
my(%number2date) = ( my(%number2date) = (
41 => "98apr", 41 => "98apr",
40 => "97dec", 39 => "97aug", 38 => "97apr", 40 => "97dec", 39 => "97aug", 38 => "97apr",
37 => "96dec", 36 => "96jun", 35 => "96mar", 37 => "96dec", 36 => "96jun", 35 => "96mar",
34 => "95dec", 33 => "95jul", 32 => "95apr", 34 => "95dec", 33 => "95jul", 32 => "95apr",
31 => "94dec", 30 => "94jul", 29 => "94mar", 31 => "94dec", 30 => "94jul", 29 => "94mar",
28 => "93nov", 27 => "93jul", 26 => "93mar", 28 => "93nov", 27 => "93jul", 26 => "93mar",
25 => "92nov", 24 => "92jul", 23 => "92mar", 25 => "92nov", 24 => "92jul", 23 => "92mar",
22 => "91nov", 21 => "91jul", 20 => "91mar", 22 => "91nov", 21 => "91jul", 20 => "91mar",
19 => "90dec" ); 19 => "90dec" );
my($wgpath) = "/ftp/ietf"; my($wgpath) = "/ftp/ietf";
my($urn) = $ENV{'QUERY_STRING'}; my($urn) = $ENV{'QUERY_STRING'};
my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i); (&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(i);
(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(\d*)-(\w*)/i); (&resolverfc($1, $2), exit) if ($urn =~ /urn:ietf:(72)/i);
&urn_error("400 Bad Request\n"); (&resolvemtg($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(9*)-(
120&urn_error("400 Bad Request0);
sub resolve2 { sub resolvemtg {
my($ietfnum, $sesnam) = @_; my($ietfnum, $sesnam) = @_;
&urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum}); &urn_error("404 Not Found0) if (!defined $number2date{$ietfnum});
my($date)=$number2date{$ietfnum}; my($date)=$number2date{$ietfnum};
my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
print "Status: 302 Moved temporarily\n"; print "Status: 302 Moved temporarily0;
print "Location: $link\n"; print "Location: $link0;
return; return;
} }
my($link)="$wgpath/$date/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
print "Status: 302 Moved temporarily\n"; print "Status: 302 Moved temporarily0;
print "Location: $link\n"; print "Location: $link0;
return; return;
} }
&urn_error("404 Not Found\n"); &urn_error("404 Not Found0);
} }
sub end { sub end {
my($inarg)=@_; my($inarg)=@_;
return $inarg . "st" if ($inarg =~ /1$/); return $inarg . "st" if ($inarg =~ /1$/);
return $inarg . "nd" if ($inarg =~ /2$/); return $inarg . "nd" if ($inarg =~ /2$/);
return $inarg . "rd" if ($inarg =~ /3$/); return $inarg . "rd" if ($inarg =~ /3$/);
return $inarg . "th"; return $inarg . "th";
} }
sub resolve1 { sub resolverfc {
my($flag,@bib,$i,$k,$j,$done,@ref); my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link); my($l,$link);
my($scheme, $value) = @_; my($scheme, $value) = @_;
$scheme =~ tr/A-Z/a-z/; $scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found\n")if (!defined $pathbase{$scheme}); &urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
my($txttry)="/ftp/$pathbase{$scheme}$value.txt"; my($txttry)="/ftp/$pathbase{$scheme}$value.txt";
my($pstry)="/ftp/$pathbase{$scheme}$value.ps"; my($pstry)="/ftp/$pathbase{$scheme}$value.ps";
my($htmltry)="/ftp/$pathbase{$scheme}$value.html"; my($htmltry)="/ftp/$pathbase{$scheme}$value.html";
MIME_SWITCH: { MIME_SWITCH: {
if ($accept =~ /application\/postscript/ && -f $pstry) { if ($accept =~ /application/postscript/ && -f $pstry) {
print "Status: 302 Moved temporarily\n"; print "Status: 302 Moved temporarily0;
print "Location: http://$host/$pathbase{$scheme}$value.ps\n\n"; print "Location: http://$host/$pathbase{$scheme}$value.ps0;
last MIME_SWITCH; last MIME_SWITCH;
} }
if ($accept =~ /text\/html/ && -f $htmltry) { if ($accept =~ /text/html/ && -f $htmltry) {
print "Status: 302 Moved temporarily\n"; print "Status: 302 Moved temporarily0;
print "Location: http://$host/$pathbase{$scheme}$value.html\n\n"; print "Location: http://$host/$pathbase{$scheme}$value.html0;
last MIME_SWITCH; last MIME_SWITCH;
} }
if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) { if ($accept =~ /text/plain/ && -f $txttry) {
print "Status: 302 Moved temporarily\n"; print "Status: 302 Moved temporarily0;
print "Location: http://$host/$pathbase{$scheme}$value.txt\n\n"; print "Location: http://$host/$pathbase{$scheme}$value.txt0;
last MIME_SWITCH; last MIME_SWITCH;
} }
&urn_error("404 Not Found\n"); &urn_error("404 Not Found0);
} }
} }
sub urn_error {
my($code) = @_; #store failure code here...
sub urn_error { print "Status: $code";
my($code) = @_; #store failure code here... print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2L $code</title></head>0;
print "<BODY>0;
print "<h1>URN to URL resolution failed for the URN:</h1>0;
print "<hr><h3>$urn</h3>0;
print "</body>0;
print "</html>0;
exit;
}
print "Status: $code"; sub resolveid {
print "Content-type: text/html\n\n<HTML>\n"; my($flag,@bib,$i,$k,$j,$done,@ref);
print "<head><title>URN Resolution: I2L $code</title></head>\n"; my($l,$link);
print "<BODY>\n"; my($scheme) = "id";
print "<h1>URN to URL resolution failed for the URN:</h1>\n"; my($value) = @_;
print "<hr><h3>$urn</h3>\n"; $scheme =~ tr/A-Z/a-z/;
print "</body>\n"; &urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
print "</html>\n"; my($txttry)="/ftp/$pathbase{$scheme}$value.txt";
exit; my($pstry)="/ftp/$pathbase{$scheme}$value.ps";
} my($htmltry)="/ftp/$pathbase{$scheme}$value.html";
MIME_SWITCH: {
if ($accept =~ /application/postscript/ && -f $pstry) {
print "Status: 302 Moved temporarily0;
print "Location: http://$host/$pathbase{$scheme}$value.ps0;
last MIME_SWITCH;
}
if ($accept =~ /text/html/ && -f $htmltry) {
print "Status: 302 Moved temporarily0;
print "Location: http://$host/$pathbase{$scheme}$value.html0;
last MIME_SWITCH;
}
if ($accept =~ /text/plain/ && -f $txttry) {
print "Status: 302 Moved temporarily0;
print "Location: http://$host/$pathbase{$scheme}$value.txt0;
last MIME_SWITCH;
}
&urn_error("404 Not Found0);
}
}
A.3 I2Ls A.3 I2Ls
#!/usr/local/bin/perl #!/usr/local/bin/perl
use strict;
use strict; #
# this is a URN 2 URLs resolver for the ietf namespace
#
# my(@urls);
# this is a URN 2 URLs resolver for the ietf namespace
#
my(@urls); my(%pathbase) = (
rfc => "rfc/rfc",
fyi => "fyi/fyi",
std => "std/std",
bcp => "bcp/bcp",
id => "internet-drafts/draft-"
);
my(%pathbase) = ( my(%number2date) = (
rfc => "rfc/rfc", 41 => "98apr",
fyi => "fyi/fyi", 40 => "97dec", 39 => "97aug", 38 => "97apr",
std => "std/std", 37 => "96dec", 36 => "96jun", 35 => "96mar",
bcp => "bcp/bcp" 34 => "95dec", 33 => "95jul", 32 => "95apr",
); 31 => "94dec", 30 => "94jul", 29 => "94mar",
my(%number2date) = ( 28 => "93nov", 27 => "93jul", 26 => "93mar",
41 => "98apr", 25 => "92nov", 24 => "92jul", 23 => "92mar",
40 => "97dec", 39 => "97aug", 38 => "97apr", 22 => "91nov", 21 => "91jul", 20 => "91mar",
37 => "96dec", 36 => "96jun", 35 => "96mar", 19 => "90dec" );
34 => "95dec", 33 => "95jul", 32 => "95apr",
31 => "94dec", 30 => "94jul", 29 => "94mar",
28 => "93nov", 27 => "93jul", 26 => "93mar",
25 => "92nov", 24 => "92jul", 23 => "92mar",
22 => "91nov", 21 => "91jul", 20 => "91mar",
19 => "90dec" );
my($wgpath) = "/ftp/ietf"; my($wgpath) = "/ftp/ietf";
my($urn) = $ENV{'QUERY_STRING'}; my($urn) = $ENV{'QUERY_STRING'};
my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i); (&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(i);
(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(\d*)-(\w*)/i); (&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(72)/i);
&urn_error("400 Bad Request\n"); (&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(9*)-(
120&urn_error("400 Bad Request0);
sub resolve2 { sub resolve2 {
my($ietfnum, $sesnam) = @_; my($ietfnum, $sesnam) = @_;
&urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum}); &urn_error("404 Not Found0) if (!defined $number2date{$ietfnum});
my($date)=$number2date{$ietfnum}; my($date)=$number2date{$ietfnum};
my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
$link=~s/^\/ftp\///; $link=~s/^/ftp///;
my($ftplink)="ftp://$host/$link"; my($ftplink)="ftp://$host/$link";
my($httplink)="http://$host/$link"; my($httplink)="http://$host/$link";
my($glink)="gopher://$host:70/0/$link"; my($glink)="gopher://$host:70/0/$link";
if ($accept =~ /text\/uri-list/) { #look for text/uri-list, otherwise text/html if ($accept =~ /text/uri-list/) { #look for text/uri-list, otherwise text/html
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/uri-list\n\n\n"; print "Content-type: text/uri-list0;
print "#$urn\n"; print "#$urn0;
print "$ftplink\n"; print "$ftplink0;
print "$httplink\n"; print "$httplink0;
print "$glink\n"; print "$glink0;
} }
if ($accept =~ /\*\/\*|text\/html/) { if ($accept =~ /text/html/) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/html\n\n<HTML>\n"; print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Ls</title></head>\n"; print "<head><title>URN Resolution: I2Ls</title></head>0;
print "<BODY>\n"; print "<BODY>0;
print "<h1>URN $urn resolves to the following URLs:</h1>\n"; print "<h1>URN $urn resolves to the following URLs:</h1>0;
print "<hr><ul>\n"; print "<hr><ul>0;
print "<a href=\"$ftplink\">$ftplink</a>\n"; print "<a href=
print "<a href=\"$httplink\">$httplink</a>\n"; print "<a href=
print "<a href=\"$glink\">$glink</a>\n"; print "<a href=
print "</UL>\n</body>\n</HTML>\n"; print "</UL>0/body>0/HTML>0;
} }
return; return;
} }
my($link)="$wgpath/$date/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
$link=~s/^\/ftp\///; $link=~s/^/ftp///;
my($ftplink)="ftp://$host/$link"; my($ftplink)="ftp://$host/$link";
my($httplink)="http://$host/$link"; my($httplink)="http://$host/$link";
my($glink)="gopher://$host:70/0/$link"; my($glink)="gopher://$host:70/0/$link";
if ($accept =~ /text\/uri-list/) { #look for text/uri-list, otherwise text/html if ($accept =~ /text/uri-list/) { #look for text/uri-list, otherwise text/html
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/uri-list\n\n\n"; print "Content-type: text/uri-list0;
print "#$urn\n"; print "#$urn0;
print "$ftplink\n"; print "$ftplink0;
print "$httplink\n"; print "$httplink0;
print "$glink\n"; print "$glink0;
} }
if ($accept =~ /\*\/\*|text\/html/) { if ($accept =~ /text/html/) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/html\n\n<HTML>\n"; print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Ls</title></head>\n"; print "<head><title>URN Resolution: I2Ls</title></head>0;
print "<BODY>\n"; print "<BODY>0;
print "<h1>URN $urn resolves to the following URLs:</h1>\n"; print "<h1>URN $urn resolves to the following URLs:</h1>0;
print "<hr><ul>\n"; print "<hr><ul>0;
print "<a href=\"$ftplink\">$ftplink</a>\n"; print "<a href=
print "<a href=\"$httplink\">$httplink</a>\n"; print "<a href=
print "<a href=\"$glink\">$glink</a>\n"; print "<a href=
print "</UL>\n</body>\n</HTML>\n"; print "</UL>0/body>0/HTML>0;
} }
return; return;
}
&urn_error("404 Not Found\n");
}
sub resolve1 { }
my($flag,@bib,$i,$k,$j,$done,@ref); &urn_error("404 Not Found0);
my($l,$link); }
my($scheme, $value) = @_;
$scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found\n")if (!defined $pathbase{$scheme});
my($try)="/ftp/$pathbase{$scheme}$value.txt";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.txt");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.txt");
push(@urls, "gopher://$host:70/0/$pathbase{$scheme}$value.txt");
}
$try="/ftp/$pathbase{$scheme}$value.ps";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.ps");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.ps");
push(@urls, "gopher://$host:70/0/$pathbase{$scheme}$value.ps");
}
$try="/ftp/$pathbase{$scheme}$value.html";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.html");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.html");
}
&urn_error("404 Not Found\n") if ($#urls == -1); sub resolve1 {
my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link);
my($scheme, $value) = @_;
$scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
my($try)="/ftp/$pathbase{$scheme}$value.txt";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.txt");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.txt");
push(@urls, "gopher://$host:70/0/$pathbase{$scheme}$value.txt");
}
$try="/ftp/$pathbase{$scheme}$value.ps";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.ps");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.ps");
push(@urls, "gopher://$host:70/0/$pathbase{$scheme}$value.ps");
}
$try="/ftp/$pathbase{$scheme}$value.html";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.html");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.html");
}
MIME_SWITCH: { &urn_error("404 Not Found0) if ($#urls == -1);
if ($accept =~ /text\/uri-list/) { #look for text/uri-list, otherwise text/html
print "Status: 200 OK\n";
print "Content-type: text/uri-list\n\n\n";
print "#$urn\n";
foreach $i (@urls) {
print "$i\n";
}
last MIME_SWITCH;
}
if ($accept =~ /\*\/\*|text\/html/) {
print "Status: 200 OK\n";
print "Content-type: text/html\n\n<HTML>\n";
print "<head><title>URN Resolution: I2Ls</title></head>\n";
print "<BODY>\n";
print "<h1>URN $urn resolves to the following URLs:</h1>\n";
print "<hr><ul>\n";
foreach $i (@urls) {
print "<LI><A HREF=\"$i\">$i</A>\n";
}
print "</UL>\n</body>\n</HTML>\n";
last MIME_SWITCH;
}
}
}
sub urn_error { MIME_SWITCH: {
my($code) = @_; #store failure code here... if ($accept =~ /text/uri-list/) { #look for text/uri-list, otherwise text/html
print "Status: 200 OK0;
print "Content-type: text/uri-list0;
print "#$urn0;
foreach $i (@urls) {
print "$i0;
}
last MIME_SWITCH;
}
if ($accept =~ /text/html/) {
print "Status: 200 OK0;
print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Ls</title></head>0;
print "<BODY>0;
print "<h1>URN $urn resolves to the following URLs:</h1>0;
print "<hr><ul>0;
foreach $i (@urls) {
print "<LI><A HREF=
}
print "</UL>0/body>0/HTML>0;
last MIME_SWITCH;
}
}
}
print "Status: $code"; sub urn_error {
print "Content-type: text/html\n\n<HTML>\n"; my($code) = @_; #store failure code here...
print "<head><title>URN Resolution: I2Ls $code</title></head>\n";
print "<BODY>\n"; print "Status: $code";
print "<h1>URN to URL resolution failed for the URN:</h1>\n"; print "Content-type: text/html0HTML>0;
print "<hr><h3>$urn</h3>\n"; print "<head><title>URN Resolution: I2L $code</title></head>0;
print "</body>\n"; print "<BODY>0;
print "</html>\n"; print "<h1>URN to URL resolution failed for the URN:</h1>0;
exit; print "<hr><h3>$urn</h3>0;
} print "</body>0;
print "</html>0;
exit;
}
sub resolveid {
my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link);
my($value) = @_;
my($scheme) = "id";
$scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
my($try)="/ftp/$pathbase{$scheme}$value.txt";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.txt");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.txt");
push(@urls, "gopher://$host:70/0/$pathbase{$scheme}$value.txt");
}
$try="/ftp/$pathbase{$scheme}$value.ps";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.ps");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.ps");
push(@urls, "gopher://$host:70/0/$pathbase{$scheme}$value.ps");
}
$try="/ftp/$pathbase{$scheme}$value.html";
if (-f $try) {
push(@urls, "http://$host/$pathbase{$scheme}$value.html");
push(@urls, "ftp://$host/$pathbase{$scheme}$value.html");
}
&urn_error("404 Not Found0) if ($#urls == -1);
MIME_SWITCH: {
if ($accept =~ /text/uri-list/) { #look for text/uri-list, otherwise text/html
print "Status: 200 OK0;
print "Content-type: text/uri-list0;
print "#$urn0;
foreach $i (@urls) {
print "$i0;
}
last MIME_SWITCH;
}
if ($accept =~ /text/html/) {
print "Status: 200 OK0;
print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Ls</title></head>0;
print "<BODY>0;
print "<h1>URN $urn resolves to the following URLs:</h1>0;
print "<hr><ul>0;
foreach $i (@urls) {
print "<LI><A HREF=
}
print "</UL>0/body>0/HTML>0;
last MIME_SWITCH;
}
}
}
A.4 I2Ns A.4 I2Ns
#!/usr/local/bin/perl #!/usr/local/bin/perl
use strict; use strict;
# #
# this is a URN 2 URNs resolver for the ietf namespace # this is a URN 2 URNs resolver for the ietf namespace
# #
my(%cite) = ( my(%cite) = (
rfc => "/ftp/rfc/rfc-index.txt", rfc => "/ftp/rfc/rfc-index.txt",
fyi => "/ftp/fyi/fyi-index.txt", fyi => "/ftp/fyi/fyi-index.txt",
std => "/ftp/std/std-index.txt", std => "/ftp/std/std-index.txt",
bcp => "/ftp/rfc/bcp-index.txt" bcp => "/ftp/rfc/bcp-index.txt"
); );
my(%number2date) = ( my(%number2date) = (
41 => "98apr", 41 => "98apr",
40 => "97dec", 39 => "97aug", 38 => "97apr", 40 => "97dec", 39 => "97aug", 38 => "97apr",
37 => "96dec", 36 => "96jun", 35 => "96mar", 37 => "96dec", 36 => "96jun", 35 => "96mar",
34 => "95dec", 33 => "95jul", 32 => "95apr", 34 => "95dec", 33 => "95jul", 32 => "95apr",
31 => "94dec", 30 => "94jul", 29 => "94mar", 31 => "94dec", 30 => "94jul", 29 => "94mar",
28 => "93nov", 27 => "93jul", 26 => "93mar", 28 => "93nov", 27 => "93jul", 26 => "93mar",
25 => "92nov", 24 => "92jul", 23 => "92mar", 25 => "92nov", 24 => "92jul", 23 => "92mar",
22 => "91nov", 21 => "91jul", 20 => "91mar", 22 => "91nov", 21 => "91jul", 20 => "91mar",
19 => "90dec" ); 19 => "90dec" );
my($wgpath) = "/ftp/ietf"; my($wgpath) = "/ftp/ietf";
my($urn) = $ENV{'QUERY_STRING'}; my($urn) = $ENV{'QUERY_STRING'};
my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header my($port) = $ENV{'SERVER_PORT'};
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i); (&resolve1("id", $1), exit) if ($urn =~ /urn:ietf:id:(/i);
(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(\d*)-(\w*)/i); (&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(72)/i);
&urn_error("400 Bad Request\n"); (&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(9*)-(
120&urn_error("400 Bad Request0);
sub resolve2 { sub resolve2 {
my($ietfnum, $sesnam) = @_; my($ietfnum, $sesnam) = @_;
&urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum}); &urn_error("404 Not Found0) if (!defined $number2date{$ietfnum});
my($date)=$number2date{$ietfnum}; my($date)=$number2date{$ietfnum};
my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
if ($accept =~ /text\/uri-list/) { if ($accept =~ /text/uri-list/) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/uri-list\n\n\n"; print "Content-type: text/uri-list0;
print "#$urn\n"; print "#$urn0;
return; return;
} }
if ($accept =~ /\*\/\*|text\/html/) { if ($accept =~ /text/html/) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/html\n\n<HTML>\n"; print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Ns</title></head>\n"; print "<head><title>URN Resolution: I2Ns</title></head>0;
print "<BODY>\n"; print "<BODY>0;
print "<h1>URN $urn resolves to the following URNs:</h1>\n"; print "<h1>URN $urn resolves to the following URNs:</h1>0;
print "<hr><ul>\n"; print "<hr><ul>0;
print "</UL>\n</body>\n</HTML>\n"; print "</UL>0/body>0/HTML>0;
return; return;
} }
} }
my($link)="$wgpath/$date/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
if ($accept =~ /text\/uri-list/) { if ($accept =~ /text/uri-list/) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/uri-list\n\n\n"; print "Content-type: text/uri-list0;
print "#$urn\n"; print "#$urn0;
return; return;
} }
if ($accept =~ /\*\/\*|text\/html/) { if ($accept =~ /text/html/) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/html\n\n<HTML>\n"; print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Ns</title></head>\n"; print "<head><title>URN Resolution: I2Ns</title></head>0;
print "<BODY>\n"; print "<BODY>0;
print "<h1>URN $urn resolves to the following URNs:</h1>\n"; print "<h1>URN $urn resolves to the following URNs:</h1>0;
print "<hr><ul>\n"; print "<hr><ul>0;
print "</UL>\n</body>\n</HTML>\n"; print "</UL>0/body>0/HTML>0;
return; return;
} }
} }
&urn_error("404 Not Found\n"); &urn_error("404 Not Found0);
} }
sub end { sub end {
my($inarg)=@_; my($inarg)=@_;
return $inarg . "st" if ($inarg =~ /1$/); return $inarg . "st" if ($inarg =~ /1$/);
return $inarg . "nd" if ($inarg =~ /2$/); return $inarg . "nd" if ($inarg =~ /2$/);
return $inarg . "rd" if ($inarg =~ /3$/); return $inarg . "rd" if ($inarg =~ /3$/);
return $inarg . "th"; return $inarg . "th";
} }
sub resolve1 {
my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link);
my($scheme, $value) = @_;
$scheme =~ tr/A-Z/a-z/;
if (!defined $cite{$scheme}) {
&urn_error("404 Not Found\n");
}
$flag = 0; sub resolve1 {
open(INPUT, "$cite{$scheme}"); my($flag,@bib,$i,$k,$j,$done,@ref);
while (<INPUT>) { my($l,$link);
$flag = 1 if (/^0*$value /); my($scheme, $value) = @_;
if ($flag == 1) { $scheme =~ tr/A-Z/a-z/;
last if (/^$/); if (!defined $cite{$scheme}) {
chop; &urn_error("404 Not Found0);
push @bib,$_; }
}
}
$k=join " ",@bib; $flag = 0;
while ($k =~ /(\S*)\s*(fyi|std|rfc|bcp)\s*([0-9]+)(.*)/i) { open(INPUT, "$cite{$scheme}");
$k=$4; while (<INPUT>) {
$a=$2; $b=$3; $flag = 1 if (/^0*$value /);
if (($a ne $scheme || $b ne $value) && ($1 !~ /obso/i)){ if ($flag == 1) {
$a =~ tr/A-Z/a-z/; last if (/^$/);
$b =~ s/^0*//; chop;
push @ref,"urn:ietf:$a:$b"; push @bib,$_;
} }
} }
MIME_SWITCH: { $k=join " ",@bib;
if ($accept =~ /text\/uri-list/) { while ($k =~ /(fyi|std|rfc|bcp)([0-9]+)(.*)/i) {
print "Status: 200 OK\n"; $k=$4;
print "Content-type: text/uri-list\n\n\n"; $a=$2; $b=$3;
print "#$urn\n"; if (($a ne $scheme || $b ne $value) && ($1 !~ /obso/i)){
foreach $i (@ref) { $a =~ tr/A-Z/a-z/;
print "$i\n"; $b =~ s/^0*//;
} push @ref,"urn:ietf:$a:$b";
last MIME_SWITCH; }
} }
if ($accept =~ /\*\/\*|text\/html/) {
print "Status: 200 OK\n";
print "Content-type: text/html\n\n<HTML>\n";
print "<head><title>URN Resolution: I2Ns</title></head>\n";
print "<BODY>\n";
print "<h1>URN $urn resolves to the following URNs:</h1>\n";
print "<hr><ul>\n";
foreach $i (@ref) {
print "<li>$i: Click to resolve using\n";
print "<a href=\"http://$host:$port/uri-res/I2C?$i\">I2C</a>,\n";
print "<a href=\"http://$host:$port/uri-res/I2L?$i\">I2L</a>,\n";
print "<a href=\"http://$host:$port/uri-res/I2Ls?$i\">I2Ls</a>,\n";
print "<a href=\"http://$host:$port/uri-res/I2R?$i\">I2R</a>,\n";
print "<a href=\"http://$host:$port/uri-res/I2Rs?$i\">I2Rs</a>\n";
}
print "</UL>\n</body>\n</HTML>\n";
}
}
}
sub make_link { MIME_SWITCH: {
my($sc); if ($accept =~ /text/uri-list/) {
my($inarg)=@_; print "Status: 200 OK0;
($sc=$1) if ($inarg =~ /([a-z]*)/); print "Content-type: text/uri-list0;
return "/$sc/$inarg.ps" if (-e "/ftp/$sc/$inarg.ps"); print "#$urn0;
return "/$sc/$inarg.html" if (-e "/ftp/$sc/$inarg.html"); foreach $i (@ref) {
return "/$sc/$inarg.txt"; print "$i0;
} }
last MIME_SWITCH;
}
if ($accept =~ /text/html/) {
print "Status: 200 OK0;
print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Ns</title></head>0;
print "<BODY>0;
print "<h1>URN $urn resolves to the following URNs:</h1>0;
print "<hr><ul>0;
foreach $i (@ref) {
print "<li>$i: Click to resolve using0;
print "<a href=
print "<a href=
print "<a href=
print "<a href=
print "<a href=
}
print "</UL>0/body>0/HTML>0;
}
}
}
sub urn_error { sub make_link {
my($code) = @_; #store failure code here... my($sc);
my($inarg)=@_;
($sc=$1) if ($inarg =~ /([a-z]*)/);
return "/$sc/$inarg.ps" if (-e "/ftp/$sc/$inarg.ps");
return "/$sc/$inarg.html" if (-e "/ftp/$sc/$inarg.html");
return "/$sc/$inarg.txt";
}
print "Status: $code"; sub urn_error {
print "Content-type: text/html\n\n<HTML>\n"; my($code) = @_; #store failure code here...
print "<head><title>URN Resolution: I2Ns $code</title></head>\n";
print "<BODY>\n"; print "Status: $code";
print "<h1>URN to URC resolution failed for the URN:</h1>\n"; print "Content-type: text/html0HTML>0;
print "<hr><h3>$urn</h3>\n"; print "<head><title>URN Resolution: I2Ns $code</title></head>0;
print "</body>\n"; print "<BODY>0;
print "</html>\n"; print "<h1>URN to URN resolution failed for the URN:</h1>0;
exit; print "<hr><h3>$urn</h3>0;
}; print "</body>0;
print "</html>0;
exit;
};
A.5 I2R A.5 I2R
#!/usr/local/bin/perl #!/usr/local/bin/perl
use strict; use strict;
# #
# this is a URN 2 resource resolver for the ietf namespace # this is a URN 2 resource resolver for the ietf namespace
# #
my(%pathbase) = ( my(%pathbase) = (
rfc => "rfc/rfc", rfc => "rfc/rfc",
fyi => "fyi/fyi", fyi => "fyi/fyi",
std => "std/std", std => "std/std",
bcp => "bcp/bcp" bcp => "bcp/bcp",
); id => "internet-drafts/draft-"
);
my(%number2date) = ( my(%number2date) = (
41 => "98apr", 41 => "98apr",
40 => "97dec", 39 => "97aug", 38 => "97apr", 40 => "97dec", 39 => "97aug", 38 => "97apr",
37 => "96dec", 36 => "96jun", 35 => "96mar", 37 => "96dec", 36 => "96jun", 35 => "96mar",
34 => "95dec", 33 => "95jul", 32 => "95apr", 34 => "95dec", 33 => "95jul", 32 => "95apr",
31 => "94dec", 30 => "94jul", 29 => "94mar", 31 => "94dec", 30 => "94jul", 29 => "94mar",
28 => "93nov", 27 => "93jul", 26 => "93mar", 28 => "93nov", 27 => "93jul", 26 => "93mar",
25 => "92nov", 24 => "92jul", 23 => "92mar", 25 => "92nov", 24 => "92jul", 23 => "92mar",
22 => "91nov", 21 => "91jul", 20 => "91mar", 22 => "91nov", 21 => "91jul", 20 => "91mar",
19 => "90dec" ); 19 => "90dec" );
my($wgpath) = "/ftp/ietf"; my($wgpath) = "/ftp/ietf";
my($urn) = $ENV{'QUERY_STRING'}; my($urn) = $ENV{'QUERY_STRING'};
my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i); print "$urn0;
(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(\d*)-(\w*)/i); (&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(i);
&urn_error("400 Bad Request\n"); (&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(72)/i);
(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(9*)-(
120&urn_error("400 Bad Request0);
sub resolve2 { sub resolve2 {
my($ietfnum, $sesnam) = @_; my($ietfnum, $sesnam) = @_;
&urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum}); &urn_error("404 Not Found0) if (!defined $number2date{$ietfnum});
my($date)=$number2date{$ietfnum}; my($date)=$number2date{$ietfnum};
my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/plain\n\n"; print "Content-type: text/plain0;
open(FILE, "$link"); open(FILE, "$link");
while (<FILE>) { while (<FILE>) {
print $_; print $_;
} }
close FILE; close FILE;
return; return;
} }
my($link)="$wgpath/$date/$sesnam-minutes-$date.txt"; my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
if (-f $link) { if (-f $link) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/plain\n\n"; print "Content-type: text/plain0;
open(FILE, "$link"); open(FILE, "$link");
while (<FILE>) { while (<FILE>) {
print $_; print $_;
} }
close FILE; close FILE;
return; return;
} }
&urn_error("404 Not Found\n"); &urn_error("404 Not Found0);
} }
sub end { sub end {
my($inarg)=@_; my($inarg)=@_;
return $inarg . "st" if ($inarg =~ /1$/); return $inarg . "st" if ($inarg =~ /1$/);
return $inarg . "nd" if ($inarg =~ /2$/); return $inarg . "nd" if ($inarg =~ /2$/);
return $inarg . "rd" if ($inarg =~ /3$/); return $inarg . "rd" if ($inarg =~ /3$/);
return $inarg . "th"; return $inarg . "th";
} }
sub resolve1 { sub resolve1 {
my($flag,@bib,$i,$k,$j,$done,@ref); my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link); my($l,$link);
my($scheme, $value) = @_; my($scheme, $value) = @_;
$scheme =~ tr/A-Z/a-z/; $scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found\n")if (!defined $pathbase{$scheme}); &urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
my($txttry)="/ftp/$pathbase{$scheme}$value.txt"; my($txttry)="/ftp/$pathbase{$scheme}$value.txt";
my($pstry)="/ftp/$pathbase{$scheme}$value.ps"; my($pstry)="/ftp/$pathbase{$scheme}$value.ps";
my($htmltry)="/ftp/$pathbase{$scheme}$value.html"; my($htmltry)="/ftp/$pathbase{$scheme}$value.html";
MIME_SWITCH: { MIME_SWITCH: {
if ($accept =~ /application\/postscript/ && -f $pstry) { if ($accept =~ /application/postscript/ && -f $pstry) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: application/postscript\n\n"; print "Content-type: application/postscript0;
open(FILE, "$pstry"); open(FILE, "$pstry");
while (<FILE>) { while (<FILE>) {
print $_; print $_;
} }
close FILE; close FILE;
last MIME_SWITCH; last MIME_SWITCH;
} }
if ($accept =~ /text\/html/ && -f $htmltry) { if ($accept =~ /text/html/ && -f $htmltry) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/html\n\n"; print "Content-type: text/html0;
open(FILE, "$htmltry"); open(FILE, "$htmltry");
while (<FILE>) { while (<FILE>) {
print $_; print $_;
} }
close FILE; close FILE;
last MIME_SWITCH; last MIME_SWITCH;
} }
if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) { if ($accept =~ /text/plain/ && -f $txttry) {
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: text/plain\n\n"; print "Content-type: text/plain0;
open(FILE, "$txttry"); open(FILE, "$txttry");
while (<FILE>) { while (<FILE>) {
print $_; print $_;
} }
close FILE; close FILE;
last MIME_SWITCH; last MIME_SWITCH;
} }
&urn_error("404 Not Found\n"); &urn_error("404 Not Found0);
} }
} }
sub urn_error { sub resolveid {
my($code) = @_; #store failure code here... my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link);
my($scheme) = "id";
my($value) = @_;
$scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
my($txttry)="/ftp/$pathbase{$scheme}$value.txt";
my($pstry)="/ftp/$pathbase{$scheme}$value.ps";
my($htmltry)="/ftp/$pathbase{$scheme}$value.html";
MIME_SWITCH: {
if ($accept =~ /application/postscript/ && -f $pstry) {
print "Status: 200 OK0;
print "Content-type: application/postscript0;
open(FILE, "$pstry");
while (<FILE>) {
print $_;
}
close FILE;
last MIME_SWITCH;
}
if ($accept =~ /text/html/ && -f $htmltry) {
print "Status: 200 OK0;
print "Content-type: text/html0;
open(FILE, "$htmltry");
while (<FILE>) {
print $_;
}
close FILE;
last MIME_SWITCH;
}
if ($accept =~ /text/plain/ && -f $txttry) {
print "Status: 200 OK0;
print "Content-type: text/plain0;
open(FILE, "$txttry");
while (<FILE>) {
print $_;
}
close FILE;
last MIME_SWITCH;
}
&urn_error("404 Not Found0);
}
}
print "Status: $code"; sub urn_error {
print "Content-type: text/html\n\n<HTML>\n"; my($code) = @_; #store failure code here...
print "<head><title>URN Resolution: I2R $code</title></head>\n";
print "<BODY>\n";
print "<h1>URN to URL resolution failed for the URN:</h1>\n";
print "<hr><h3>$urn</h3>\n";
print "</body>\n";
print "</html>\n";
exit;
}
print "Status: $code";
print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2R $code</title></head>0;
print "<BODY>0;
print "<h1>URN to URL resolution failed for the URN:</h1>0;
print "<hr><h3>$urn</h3>0;
print "</body>0;
print "</html>0;
exit;
}
A.6 I2Rs A.6 I2Rs
#!/usr/local/bin/perl #!/usr/local/bin/perl
use strict;
# use strict;
# this is a URN 2 resources resolver for the ietf namespace
#
my(@urls); #
# this is a URN 2 resources resolver for the ietf namespace
#
my(%pathbase) = ( my(@urls);
rfc => "rfc/rfc",
fyi => "fyi/fyi",
std => "std/std",
bcp => "bcp/bcp"
);
my(%number2date) = ( my(%pathbase) = (
41 => "98apr", rfc => "rfc/rfc",
40 => "97dec", 39 => "97aug", 38 => "97apr", fyi => "fyi/fyi",
37 => "96dec", 36 => "96jun", 35 => "96mar", std => "std/std",
34 => "95dec", 33 => "95jul", 32 => "95apr", bcp => "bcp/bcp",
31 => "94dec", 30 => "94jul", 29 => "94mar", id => "internet-drafts/draft-"
28 => "93nov", 27 => "93jul", 26 => "93mar", );
25 => "92nov", 24 => "92jul", 23 => "92mar",
22 => "91nov", 21 => "91jul", 20 => "91mar",
19 => "90dec" );
my($wgpath) = "/ftp/ietf"; my(%number2date) = (
my($urn) = $ENV{'QUERY_STRING'}; 41 => "98apr",
my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs 40 => "97dec", 39 => "97aug", 38 => "97apr",
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header 37 => "96dec", 36 => "96jun", 35 => "96mar",
34 => "95dec", 33 => "95jul", 32 => "95apr",
31 => "94dec", 30 => "94jul", 29 => "94mar",
28 => "93nov", 27 => "93jul", 26 => "93mar",
25 => "92nov", 24 => "92jul", 23 => "92mar",
22 => "91nov", 21 => "91jul", 20 => "91mar",
19 => "90dec" );
(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i); my($wgpath) = "/ftp/ietf";
(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(\d*)-(\w*)/i); my($urn) = $ENV{'QUERY_STRING'};
&urn_error("400 Bad Request\n"); my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
sub resolve2 { (&resolveid($1), exit) if ($urn =~ /urn:ietf:id:()/i);
my($ietfnum, $sesnam) = @_; (&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(72)/i);
my(@vers,$i); (&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg-(9*)-(
&urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum}); 120&urn_error("400 Bad Request0);
my($date)=$number2date{$ietfnum};
my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
if (-f $link) {
push(@vers,$link);
}
$link="$wgpath/$date/$sesnam-minutes-$date.txt";
if (-f $link) {
push(@vers,$link);
}
&urn_error("404 Not Found\n") if ($#vers==-1);
print "Status: 200 OK\n"; sub resolve2 {
print "Content-type: multipart/alternative; boundary=endpart\n\n"; my($ietfnum, $sesnam) = @_;
foreach $i (@vers) { my(@vers,$i);
print "--endpart\n"; &urn_error("404 Not Found0) if (!defined $number2date{$ietfnum});
if ($i =~ /html$/) { my($date)=$number2date{$ietfnum};
print "Content-Type: text/html\n\n"; my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
} if (-f $link) {
if ($i =~ /txt$/) { push(@vers,$link);
print "Content-Type: text/plain\n\n"; }
} $link="$wgpath/$date/$sesnam-minutes-$date.txt";
if ($i =~ /ps$/) { if (-f $link) {
print "Content-Type: application/postscript\n\n"; push(@vers,$link);
} }
open(FILE, "$i"); &urn_error("404 Not Found0) if ($#vers==-1);
while (<FILE>) {
print "$_";
}
close FILE;
} print "Status: 200 OK0;
print "--endpart\n"; print "Content-type: multipart/alternative; boundary=endpart0;
} foreach $i (@vers) {
print "--endpart0;
if ($i =~ /html$/) {
print "Content-Type: text/html0;
}
if ($i =~ /txt$/) {
print "Content-Type: text/plain0;
}
if ($i =~ /ps$/) {
print "Content-Type: application/postscript0;
}
open(FILE, "$i");
while (<FILE>) {
print "$_";
}
close FILE;
}
print "--endpart0;
}
sub resolve1 { sub resolve1 {
my($flag,@bib,$i,$k,$j,$done,@ref); my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link,@vers); my($l,$link,@vers);
my($scheme, $value) = @_; my($scheme, $value) = @_;
$scheme =~ tr/A-Z/a-z/; $scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found\n")if (!defined $pathbase{$scheme}); &urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
my($try)="/ftp/$pathbase{$scheme}$value.txt"; my($try)="/ftp/$pathbase{$scheme}$value.txt";
if (-f $try) { if (-f $try) {
push(@vers, $try); push(@vers, $try);
} }
$try="/ftp/$pathbase{$scheme}$value.ps"; $try="/ftp/$pathbase{$scheme}$value.ps";
if (-f $try) { if (-f $try) {
push(@vers, $try); push(@vers, $try);
} }
$try="/ftp/$pathbase{$scheme}$value.html"; $try="/ftp/$pathbase{$scheme}$value.html";
if (-f $try) { if (-f $try) {
push(@vers, $try); push(@vers, $try);
} }
print "Status: 200 OK\n"; print "Status: 200 OK0;
print "Content-type: multipart/alternative; boundary=endpart\n\n"; print "Content-type: multipart/alternative; boundary=endpart0;
foreach $i (@vers) { foreach $i (@vers) {
print "--endpart\n"; print "--endpart0;
if ($i =~ /html$/) { if ($i =~ /html$/) {
print "Content-Type: text/html\n\n"; print "Content-Type: text/html0;
} }
if ($i =~ /txt$/) { if ($i =~ /txt$/) {
print "Content-Type: text/plain\n\n"; print "Content-Type: text/plain0;
} }
if ($i =~ /ps$/) { if ($i =~ /ps$/) {
print "Content-Type: application/postscript\n\n"; print "Content-Type: application/postscript0;
} }
open(FILE, "$i"); open(FILE, "$i");
while (<FILE>) { while (<FILE>) {
print "$_"; print "$_";
} }
close FILE; close FILE;
} }
print "--endpart\n"; print "--endpart0;
} }
sub urn_error { sub resolveid {
my($code) = @_; #store failure code here... my($flag,@bib,$i,$k,$j,$done,@ref);
my($l,$link,@vers);
my($scheme) = "id";
my($value) = @_;
$scheme =~ tr/A-Z/a-z/;
&urn_error("404 Not Found0)if (!defined $pathbase{$scheme});
my($try)="/ftp/$pathbase{$scheme}$value.txt";
if (-f $try) {
push(@vers, $try);
}
$try="/ftp/$pathbase{$scheme}$value.ps";
if (-f $try) {
push(@vers, $try);
}
$try="/ftp/$pathbase{$scheme}$value.html";
if (-f $try) {
push(@vers, $try);
}
print "Status: 200 OK0;
print "Content-type: multipart/alternative; boundary=endpart0;
foreach $i (@vers) {
print "--endpart0;
if ($i =~ /html$/) {
print "Content-Type: text/html0;
}
if ($i =~ /txt$/) {
print "Content-Type: text/plain0;
}
if ($i =~ /ps$/) {
print "Content-Type: application/postscript0;
}
open(FILE, "$i");
while (<FILE>) {
print "$_";
}
close FILE;
}
print "--endpart0;
}
sub urn_error {
my($code) = @_; #store failure code here...
print "Status: $code"; print "Status: $code";
print "Content-type: text/html\n\n<HTML>\n"; print "Content-type: text/html0HTML>0;
print "<head><title>URN Resolution: I2Rs $code</title></head>\n"; print "<head><title>URN Resolution: I2Rs $code</title></head>0;
print "<BODY>\n"; print "<BODY>0;
print "<h1>URN to URL resolution failed for the URN:</h1>\n"; print "<h1>URN to URL resolution failed for the URN:</h1>0;
print "<hr><h3>$urn</h3>\n"; print "<hr><h3>$urn</h3>0;
print "</body>\n"; print "</body>0;
print "</html>\n"; print "</html>0;
exit; exit;
} }
 End of changes. 116 change blocks. 
889 lines changed or deleted 1146 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/