summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc2648.txt
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-11-27 20:54:24 +0100
commit4bfd864f10b68b71482b35c818559068ef8d5797 (patch)
treee3989f47a7994642eb325063d46e8f08ffa681dc /doc/rfc/rfc2648.txt
parentea76e11061bda059ae9f9ad130a9895cc85607db (diff)
doc: Add RFC documents
Diffstat (limited to 'doc/rfc/rfc2648.txt')
-rw-r--r--doc/rfc/rfc2648.txt1683
1 files changed, 1683 insertions, 0 deletions
diff --git a/doc/rfc/rfc2648.txt b/doc/rfc/rfc2648.txt
new file mode 100644
index 0000000..4869fc1
--- /dev/null
+++ b/doc/rfc/rfc2648.txt
@@ -0,0 +1,1683 @@
+
+
+
+
+
+
+Network Working Group R. Moats
+Request for Comments: 2648 AT&T
+Category: Informational August 1999
+
+
+ A URN Namespace for IETF Documents
+
+Status of this Memo
+
+ This memo provides information for the Internet community. It does
+ not specify an Internet standard of any kind. Distribution of this
+ memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+Abstract
+
+ A system for Uniform Resource Names (URNs) must be capable of
+ supporting new naming systems. As an example of proposing a new
+ namespace, this document proposes the "ietf" namespace. This
+ namespace consists of the RFC family of documents (RFCs, STDs, FYIs,
+ and BCPs) developed by the IETF and published by the RFC Editor, the
+ minutes of working groups (WG) and birds of a feather (BOF) meetings
+ that occur during IETF conferences, and the Internet Drafts published
+ by the Internet Drafts Editor. Both the current URN framework and
+ URN syntax support this namespace.
+
+1. Introduction
+
+ This document proposes the "ietf" namespace, which consists of 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
+ groups (WG) and birds of a feather (BOF) meetings that occur during
+ IETF conferences.
+
+ The namespace specification is for a formal namespace.
+
+2. Specification Template
+
+ Namespace ID:
+
+ "ietf" requested.
+
+
+
+
+
+
+
+Moats Informational [Page 1]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ Registration Information:
+
+ Registration version number: 1
+ Registration date: 1999-04-22
+
+ Declared registrant of the namespace:
+
+ Ryan Moats
+ jayhawk@att.com
+ AT&T
+ 15621 Drexel Circle
+ Omaha, NE 68135-2358
+
+ Declaration of structure:
+
+ The identifier has the following ABNF [2] specification:
+
+ NSS = rfc-nss / fyi-nss / std-nss / bcp-nss /
+ draft-nss / mtg-nss / other-nss
+
+ rfc-nss = "rfc:" 1*DIGIT
+ fyi-nss = "fyi:" 1*DIGIT
+ std-nss = "std:" 1*DIGIT
+ bcp-nss = "bcp:" 1*DIGIT
+ draft-nss = "id:" string
+ mtg-nss = "mtg:" string
+ other-nss = string
+ ; beginning with a prefix other than one of those
+ ; above for future expansion
+
+ string = 1*(DIGIT / ALPHA / "-")
+
+ If the IESG (or it successor) adds a new document series,
+ this ABNF specification will need to be updated. Further,
+ if a working group or BOF is created that used characters
+ outside the range of this ABNF specification, this
+ specification will need to be updated. Any system intended
+ to resolve names for this namespace should be written with
+ the awareness that this could occur at any time.
+
+ Relevant ancillary documentation:
+
+ Relevant documentation is in RFC 2648.
+
+
+
+
+
+
+
+
+Moats Informational [Page 2]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ Identifier uniqueness considerations:
+
+ Because the rfc-editor assigns the RFC number uniquely these
+ URNs are unique. Since the mapping between RFCs and other
+ rfc-editor document series (STDs, FYIs or BCPs) is not
+ necessarily one-to-one, uniqueness of STDs, FYIs and BCPs
+ are defined based on the document mappings maintained by the
+ RFC Editor (the index files "rfc-index.txt", "fyi-
+ index.txt", "bcp-index.txt", "std-index.txt") are defined to
+ be the definitive statement of the assignment of RFC Family
+ URNs in this namespace. The meeting minutes portion of the
+ namespace is guaranteed unique because the URN 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:
+
+ Persistence of the URNs of this namespace is independent of
+ the mutability of the underlying documents. A URN once
+ assigned will never be reassigned to a different resource;
+ the assignment is persistent and immutable. Immutability of
+ RFCs, STDs, FYIs and BCPs is at the discretion of the RFC
+ Editor. They may be composites of one or more RFCs and the
+ set of RFCs that includes them may change with time. It is
+ important to note that this mutability of some resources is
+ independent of the immutability of URN assignment to a
+ resource.
+
+ Process of identifier assignment:
+
+ Assignment of URNs from this namespace occurs in three ways.
+ The first is through publication of a new RFC, FYI, STD or
+ BCP is by the RFC Editor. This new document will have a new
+ series number and will therefore define a new URN. The
+ document mappings maintained by the RFC Editor (the index
+ files "rfc-index.txt", "fyi-index.txt", "bcp-index.txt" and
+ "std-index.txt") are defined to be the definitive statement
+ of the assignment of RFC Family URNs in this namespace.
+
+ The second way a URN is assigned is through the filing of
+ meeting minutes by a working group or birds of a feather as
+ part of an IETF conference. The list of minutes maintained
+ by the IETF for each working group and conference in the
+ subtree pointed at by the URL ftp://ietf.org/ietf/ is
+ considered the definitive assignment of URNs for working
+
+
+
+Moats Informational [Page 3]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ group or birds of a feather minutes.
+
+ 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.
+
+ Process of identifier resolution:
+
+ A mirrored copy of the underlying documentation is required
+ to resolve these URNs. Resolution via HTTP is done by a set
+ of simple Perl cgi-bin scripts presented in Appendix A.
+
+ Rules for Lexical Equivalence:
+
+ The entire URN is case-insensitive.
+
+ Conformance with URN Syntax:
+
+ There are no additional characters reserved.
+
+ Validation mechanism:
+
+ None additional to resolution specified
+
+ Scope:
+
+ 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
+ urn:ietf:mtg:41-urn
+
+
+
+
+
+
+
+
+
+
+Moats Informational [Page 4]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+4. Security Considerations
+
+ Because this namespace defines no additional reserved characters, it
+ does not add any security considerations beyond those inherent from
+ the existence of the reserved characters from [1]. Further, none of
+ the reserved characters from [1] are used in the definition of the
+ NSS. This means that resolvers for this namespace may be considered
+ "secure" in the sense that any escaping of characters in the NSS MUST
+ result in the resolver indicating that the URN has incorrect syntax.
+
+5. Acknowledgments
+
+ Thanks to various members of the URN working group for comments on
+ earlier drafts of this document. The work described in this document
+ is partially supported by the National Science Foundation,
+ Cooperative Agreement NCR-9218179.
+
+6. References
+
+ Request For Comments (RFC) and Internet Draft documents are available
+ from numerous mirror sites.
+
+ [1] Moats, R., "URN Syntax", RFC 2141, May 1997.
+
+ [2] Crocker, D. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 2234, November 1997.
+
+7. Author's Address
+
+ Ryan Moats
+ AT&T
+ 15621 Drexel Circle
+ Omaha, NE 68135-2358
+ USA
+
+ EMail: jayhawk@att.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Moats Informational [Page 5]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+Appendix A. Example Resolution Scripts
+
+ The following scripts are examples that can be used for resolving
+ URNs in this namespace.
+
+A.1 I2C
+
+#!/usr/local/bin/perl
+
+use strict;
+
+#
+# this is a URN 2 URC resolver for the ietf namespace
+#
+
+my(%cite) = (
+ bcp => "/ftp/rfc/bcp-index.txt",
+ fyi => "/ftp/fyi/fyi-index.txt",
+ id => "/ftp/internet-drafts/1id-abstracts.txt",
+ rfc => "/ftp/rfc/rfc-index.txt",
+ std => "/ftp/std/std-index.txt"
+);
+my(%number2date) = (
+ 44 => "99mar",
+ 43 => "98dec", 42 => "98aug", 41 => "98apr",
+ 40 => "97dec", 39 => "97aug", 38 => "97apr",
+ 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" );
+
+my($wgpath) = "/ftp/ietf";
+my($urn) = $ENV{'QUERY_STRING'};
+my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
+my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
+
+(&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(\S+)/i);
+(&resolverfc($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i);
+(&resolvemtg($1, $2), exit) if ($urn =~ /urn:ietf:mtg:(\d*)-(\w*)/i);
+&urn_error("400 Bad Request\n");
+
+sub resolvemtg {
+ my($ietfnum, $sesnam) = @_;
+ &urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum});
+ my($date)=$number2date{$ietfnum};
+
+
+
+Moats Informational [Page 6]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ my($link)="$wgpath/$sesnam/$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;
+ }
+ 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 {
+ my($inarg)=@_;
+ return $inarg . "st" if ($inarg =~ /1$/);
+ return $inarg . "nd" if ($inarg =~ /2$/);
+ return $inarg . "rd" if ($inarg =~ /3$/);
+ return $inarg . "th";
+}
+
+sub resolverfc {
+ 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;
+ open(INPUT, "$cite{$scheme}");
+ while (<INPUT>) {
+ $flag = 1 if (/^0*$value /);
+
+
+
+Moats Informational [Page 7]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ if ($flag == 1) {
+ last if (/^$/);
+ chop;
+ push @bib,$_;
+ }
+ }
+
+ if ($scheme ne "rfc") {
+ print "Status: 200 OK\r\n";
+ print "Content-type: text/html\r\n\r\n";
+ $bib[0] =~ s/^[0-9]*\s*/<B>/;
+ for ($i=0; $i<=$#bib; $i+=1) {
+ last if ($bib[$i] =~ s/\./.<\/B>/);
+ }
+ 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>\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";
+ } 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) {
+
+
+
+Moats Informational [Page 8]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ $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 {
+ 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";
+}
+
+sub urn_error {
+ my($code) = @_; #store failure code here...
+
+ print "Status: $code";
+ print "Content-type: text/html\n\n<HTML>\n";
+ print "<head><title>URN Resolution: I2C $code</title></head>\n";
+ print "<BODY>\n";
+ print "<h1>URN to URC resolution failed for the URN:</h1>\n";
+ print "<hr><h3>$urn</h3>\n";
+ print "</body>\n";
+ print "</html>\n";
+ exit;
+
+
+
+Moats Informational [Page 9]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+};
+
+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 || /^\s+\"/) {
+ push @bib,$_;
+ ($hdr = -1, $count = 0, $flag = 1) if (/^\s+\"/);
+ $count++ if (/^\s+$/);
+ }
+ 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 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 "<a
+href=\"http://blackhole.vip.att.net/internet-drafts/$l\">$l</a>:\n";
+ print "<pre>\n";
+ foreach $i (@bib) {
+ print "$i";
+ }
+ print "</pre>\n";
+ print "</BODY>\n</HTML>\n";
+ exit;
+ }
+ }
+ }
+ $flag = 0;
+ @bib = ();
+ }
+ }
+ &urn_error("404 Not Found\n");
+}
+
+
+
+Moats Informational [Page 10]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+A.2 I2L
+
+#!/usr/local/bin/perl
+
+use strict;
+
+#
+# this is a URN 2 URL resolver for the ietf namespace
+#
+
+my(%pathbase) = (
+ rfc => "rfc/rfc",
+ fyi => "fyi/fyi",
+ std => "std/std",
+ bcp => "bcp/bcp",
+ id => "internet-drafts/draft-"
+);
+
+my(%number2date) = (
+ 44 => "99mar",
+ 43 => "98dec", 42 => "98aug", 41 => "98apr",
+ 40 => "97dec", 39 => "97aug", 38 => "97apr",
+ 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" );
+
+my($wgpath) = "/ftp/ietf";
+my($urn) = $ENV{'QUERY_STRING'};
+my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
+my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
+
+(&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(\S+)/i);
+(&resolverfc($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i);
+(&resolvemtg($1, $2), exit) if ($urn =~ /urn:ietf:mtg:(\d*)-(\w*)/i);
+&urn_error("400 Bad Request\n");
+
+sub resolvemtg {
+ my($ietfnum, $sesnam) = @_;
+ &urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum});
+ my($date)=$number2date{$ietfnum};
+ my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+ print "Status: 302 Moved temporarily\n";
+ print "Location: $link\n";
+
+
+
+Moats Informational [Page 11]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ return;
+ }
+ my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+ print "Status: 302 Moved temporarily\n";
+ print "Location: $link\n";
+ return;
+ }
+ &urn_error("404 Not Found\n");
+}
+
+sub end {
+ my($inarg)=@_;
+ return $inarg . "st" if ($inarg =~ /1$/);
+ return $inarg . "nd" if ($inarg =~ /2$/);
+ return $inarg . "rd" if ($inarg =~ /3$/);
+ return $inarg . "th";
+}
+
+sub resolverfc {
+ my($flag,@bib,$i,$k,$j,$done,@ref);
+ my($l,$link);
+ my($scheme, $value) = @_;
+ $scheme =~ tr/A-Z/a-z/;
+ &urn_error("404 Not Found\n")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: 302 Moved temporarily\n";
+ print "Location: http://$host/$pathbase{$scheme}$value.ps\n\n";
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /text\/html/ && -f $htmltry) {
+ print "Status: 302 Moved temporarily0;
+ print "Location: http://$host/$pathbase{$scheme}$value.html\n\n";
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) {
+ print "Status: 302 Moved temporarily\n";
+ print "Location: http://$host/$pathbase{$scheme}$value.txt\n\n";
+ last MIME_SWITCH;
+ }
+ &urn_error("404 Not Found\n");
+ }
+}
+
+
+
+
+Moats Informational [Page 12]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+sub urn_error {
+ my($code) = @_; #store failure code here...
+
+ print "Status: $code";
+ print "Content-type: text/html\n\n<HTML>\n";
+ print "<head><title>URN Resolution: I2L $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;
+}
+
+sub resolveid {
+ 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 Found\n")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: 302 Moved temporarily\n";
+ print "Location: http://$host/$pathbase{$scheme}$value.ps\n\n";
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /text\/html/ && -f $htmltry) {
+ print "Status: 302 Moved temporarily\n";
+ print "Location: http://$host/$pathbase{$scheme}$value.html\n\n";
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) {
+ print "Status: 302 Moved temporarily\n";
+ print "Location: http://$host/$pathbase{$scheme}$value.txt\n\n";
+ last MIME_SWITCH;
+ }
+ &urn_error("404 Not Found\n");
+ }
+}
+
+
+
+
+
+
+
+
+Moats Informational [Page 13]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+A.3 I2Ls
+
+#!/usr/local/bin/perl
+
+use strict;
+
+#
+# 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(%number2date) = (
+ 44 => "99mar",
+ 43 => "98dec", 42 => "98aug", 41 => "98apr",
+ 40 => "97dec", 39 => "97aug", 38 => "97apr",
+ 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" );
+
+my($wgpath) = "/ftp/ietf";
+my($urn) = $ENV{'QUERY_STRING'};
+my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
+my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
+
+(&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(\S+)/i);
+(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i);
+(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg:(\d*)-(\w*)/i);
+&urn_error("400 Bad Request\n");
+
+sub resolve2 {
+ my($ietfnum, $sesnam) = @_;
+ &urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum});
+ my($date)=$number2date{$ietfnum};
+ my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+
+
+
+Moats Informational [Page 14]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ $link=~s/^\/ftp\///;
+ my($ftplink)="ftp://$host/$link";
+ my($httplink)="http://$host/$link";
+ my($glink)="gopher://$host:70/0/$link";
+
+ 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";
+ print "$ftplink\n";
+ print "$httplink\n";
+ print "$glink\n";
+ }
+ 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";
+ print "<a href=\"$ftplink\">$ftplink</a>\n";
+ print "<a href=\"$httplink\">$httplink</a>\n";
+ print "<a href=\"$glink\">$glink</a>\n";
+ print "</UL>\n</body>\n</HTML>\n";
+ }
+ return;
+ }
+ my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+ $link=~s/^\/ftp\///;
+ my($ftplink)="ftp://$host/$link";
+ my($httplink)="http://$host/$link";
+ my($glink)="gopher://$host:70/0/$link";
+ 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";
+ print "$ftplink\n";
+ print "$httplink\n";
+ print "$glink\n";
+ }
+ 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";
+
+
+
+Moats Informational [Page 15]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ print "<h1>URN $urn resolves to the following URLs:</h1>\n";
+ print "<hr><ul>\n";
+ print "<a href=\"$ftplink\">$ftplink</a>\n";
+ print "<a href=\"$httplink\">$httplink</a>\n";
+ print "<a href=\"$glink\">$glink</a>\n";
+ print "</UL>\n</body>\n</HTML>\n";
+ }
+
+ return;
+ }
+ &urn_error("404 Not Found\n");
+}
+
+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 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);
+
+MIME_SWITCH: {
+ 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";
+ }
+
+
+
+Moats Informational [Page 16]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ 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 {
+ my($code) = @_; #store failure code here...
+
+ print "Status: $code";
+ print "Content-type: text/html\n\n<HTML>\n";
+ print "<head><title>URN Resolution: I2L $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;
+}
+
+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 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");
+
+
+
+Moats Informational [Page 17]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ 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);
+
+MIME_SWITCH: {
+ 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;
+ }
+ }
+}
+
+A.4 I2Ns
+
+#!/usr/local/bin/perl
+
+use strict;
+
+#
+# this is a URN 2 URNs resolver for the ietf namespace
+#
+
+
+
+
+Moats Informational [Page 18]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+my(%cite) = (
+ rfc => "/ftp/rfc/rfc-index.txt",
+ fyi => "/ftp/fyi/fyi-index.txt",
+ std => "/ftp/std/std-index.txt",
+ bcp => "/ftp/rfc/bcp-index.txt"
+);
+
+my(%number2date) = (
+ 44 => "99mar",
+ 43 => "98dec", 42 => "98aug", 41 => "98apr",
+ 40 => "97dec", 39 => "97aug", 38 => "97apr",
+ 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" );
+
+my($wgpath) = "/ftp/ietf";
+my($urn) = $ENV{'QUERY_STRING'};
+my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
+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);
+(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg:(\d*)-(\w*)/i);
+&urn_error("400 Bad Request\n");
+
+sub resolve2 {
+ my($ietfnum, $sesnam) = @_;
+ &urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum});
+ my($date)=$number2date{$ietfnum};
+ my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+ if ($accept =~ /text\/uri-list/) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/uri-list\n\n\n";
+ print "#$urn\n";
+ return;
+ }
+ 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";
+
+
+
+Moats Informational [Page 19]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ print "</UL>\n</body>\n</HTML>\n";
+ return;
+ }
+ }
+ my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+ if ($accept =~ /text\/uri-list/) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/uri-list\n\n\n";
+ print "#$urn\n";
+ return;
+ }
+ 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";
+ print "</UL>\n</body>\n</HTML>\n";
+ return;
+ }
+ }
+ &urn_error("404 Not Found\n");
+}
+
+sub end {
+ my($inarg)=@_;
+ return $inarg . "st" if ($inarg =~ /1$/);
+ return $inarg . "nd" if ($inarg =~ /2$/);
+ return $inarg . "rd" if ($inarg =~ /3$/);
+ 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;
+ open(INPUT, "$cite{$scheme}");
+ while (<INPUT>) {
+ $flag = 1 if (/^0*$value /);
+ if ($flag == 1) {
+
+
+
+Moats Informational [Page 20]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ last if (/^$/);
+ chop;
+ push @bib,$_;
+ }
+ }
+
+ $k=join " ",@bib;
+ while ($k =~ /(\S*)\s*(fyi|std|rfc|bcp)\s*([0-9]+)(.*)/i) {
+ $k=$4;
+ $a=$2; $b=$3;
+ if (($a ne $scheme || $b ne $value) && ($1 !~ /obso/i)){
+ $a =~ tr/A-Z/a-z/;
+ $b =~ s/^0*//;
+ push @ref,"urn:ietf:$a:$b";
+ }
+ }
+
+MIME_SWITCH: {
+ if ($accept =~ /text\/uri-list/) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/uri-list\n\n\n";
+ print "#$urn\n";
+ foreach $i (@ref) {
+ 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: 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";
+
+
+
+Moats Informational [Page 21]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ }
+}
+}
+
+sub make_link {
+ 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";
+}
+
+sub urn_error {
+ my($code) = @_; #store failure code here...
+
+ print "Status: $code";
+ print "Content-type: text/html\n\n<HTML>\n";
+ print "<head><title>URN Resolution: I2Ns $code</title></head>\n";
+ print "<BODY>\n";
+ print "<h1>URN to URN resolution failed for the URN:</h1>\n";
+ print "<hr><h3>$urn</h3>\n";
+ print "</body>\n";
+ print "</html>\n";
+ exit;
+};
+
+A.5 I2R
+
+#!/usr/local/bin/perl
+
+use strict;
+
+#
+# this is a URN 2 resource resolver for the ietf namespace
+#
+
+my(%pathbase) = (
+ rfc => "rfc/rfc",
+ fyi => "fyi/fyi",
+ std => "std/std",
+ bcp => "bcp/bcp",
+ id => "internet-drafts/draft-"
+);
+
+my(%number2date) = (
+ 44 => "99mar",
+ 43 => "98dec", 42 => "98aug", 41 => "98apr",
+
+
+
+Moats Informational [Page 22]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ 40 => "97dec", 39 => "97aug", 38 => "97apr",
+ 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" );
+
+my($wgpath) = "/ftp/ietf";
+my($urn) = $ENV{'QUERY_STRING'};
+my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
+my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
+
+print "$urn\n";
+(&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(\S+)/i);
+(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i);
+(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg:(\d*)-(\w*)/i);
+&urn_error("400 Bad Request\n");
+
+sub resolve2 {
+ my($ietfnum, $sesnam) = @_;
+ &urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum});
+ my($date)=$number2date{$ietfnum};
+ my($link)="$wgpath/$sesnam/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/plain\n\n";
+ open(FILE, "$link");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ return;
+ }
+ my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
+ if (-f $link) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/plain\n\n";
+ open(FILE, "$link");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ return;
+ }
+ &urn_error("404 Not Found\n");
+}
+
+
+
+Moats Informational [Page 23]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+sub end {
+ my($inarg)=@_;
+ return $inarg . "st" if ($inarg =~ /1$/);
+ return $inarg . "nd" if ($inarg =~ /2$/);
+ return $inarg . "rd" if ($inarg =~ /3$/);
+ 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/;
+ &urn_error("404 Not Found\n")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 OK\n";
+ print "Content-type: application/postscript\n\n";
+ open(FILE, "$pstry");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /text\/html/ && -f $htmltry) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/html\n\n";
+ open(FILE, "$htmltry");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/plain\n\n";
+ open(FILE, "$txttry");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ last MIME_SWITCH;
+ }
+
+
+
+Moats Informational [Page 24]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ &urn_error("404 Not Found\n");
+ }
+}
+
+sub resolveid {
+ 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 Found\n")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 OK\n";
+ print "Content-type: application/postscript\n\n";
+ open(FILE, "$pstry");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /text\/html/ && -f $htmltry) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/html\n\n";
+ open(FILE, "$htmltry");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ last MIME_SWITCH;
+ }
+ if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) {
+ print "Status: 200 OK\n";
+ print "Content-type: text/plain\n\n";
+ open(FILE, "$txttry");
+ while (<FILE>) {
+ print $_;
+ }
+ close FILE;
+ last MIME_SWITCH;
+ }
+ &urn_error("404 Not Found\n");
+ }
+}
+
+
+
+Moats Informational [Page 25]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+sub urn_error {
+ my($code) = @_; #store failure code here...
+
+ print "Status: $code";
+ print "Content-type: text/html\n\n<HTML>\n";
+ 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;
+}
+
+A.6 I2Rs
+
+#!/usr/local/bin/perl
+
+use strict;
+
+#
+# this is a URN 2 resources 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(%number2date) = (
+ 44 => "99mar",
+ 43 => "98dec", 42 => "98aug", 41 => "98apr",
+ 40 => "97dec", 39 => "97aug", 38 => "97apr",
+ 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" );
+
+my($wgpath) = "/ftp/ietf";
+my($urn) = $ENV{'QUERY_STRING'};
+
+
+
+Moats Informational [Page 26]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+my($host) = $ENV{'SERVER_NAME'}; #get my host name for ftp: URLs
+my($accept) = $ENV{'HTTP_ACCEPT'}; #this is the "Accept:" HTTP header
+
+(&resolveid($1), exit) if ($urn =~ /urn:ietf:id:(\s*)/i);
+(&resolve1($1, $2), exit) if ($urn =~ /urn:ietf:(\w*):(\d*)/i);
+(&resolve2($1, $2), exit) if ($urn =~ /urn:ietf:mtg:(\d*)-(\w*)/i);
+&urn_error("400 Bad Request\n");
+
+sub resolve2 {
+ my($ietfnum, $sesnam) = @_;
+ my(@vers,$i);
+ &urn_error("404 Not Found\n") if (!defined $number2date{$ietfnum});
+ 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";
+ print "Content-type: multipart/alternative; boundary=endpart\n\n";
+ foreach $i (@vers) {
+ print "--endpart\n";
+ if ($i =~ /html$/) {
+ print "Content-Type: text/html\n\n";
+ }
+ if ($i =~ /txt$/) {
+ print "Content-Type: text/plain\n\n";
+ }
+ if ($i =~ /ps$/) {
+ print "Content-Type: application/postscript\n\n";
+ }
+ open(FILE, "$i");
+ while (<FILE>) {
+ print "$_";
+ }
+ close FILE;
+ }
+ print "--endpart\n";
+}
+
+sub resolve1 {
+ my($flag,@bib,$i,$k,$j,$done,@ref);
+
+
+
+Moats Informational [Page 27]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ my($l,$link,@vers);
+ 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(@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 OK\n";
+ print "Content-type: multipart/alternative; boundary=endpart\n\n";
+ foreach $i (@vers) {
+ print "--endpart\n";
+ if ($i =~ /html$/) {
+ print "Content-Type: text/html\n\n";
+ }
+ if ($i =~ /txt$/) {
+ print "Content-Type: text/plain\n\n";
+ }
+ if ($i =~ /ps$/) {
+ print "Content-Type: application/postscript\n\n";
+ }
+ open(FILE, "$i");
+ while (<FILE>) {
+ print "$_";
+ }
+ close FILE;
+ }
+ print "--endpart\n";
+}
+
+sub resolveid {
+ 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 Found\n")if (!defined $pathbase{$scheme});
+ my($try)="/ftp/$pathbase{$scheme}$value.txt";
+ if (-f $try) {
+
+
+
+Moats Informational [Page 28]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+ 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 OK\n";
+ print "Content-type: multipart/alternative; boundary=endpart\n\n";
+ foreach $i (@vers) {
+ print "--endpart\n";
+ if ($i =~ /html$/) {
+ print "Content-Type: text/html\n\n";
+
+ }
+ if ($i =~ /txt$/) {
+ print "Content-Type: text/plain\n\n";
+ }
+ if ($i =~ /ps$/) {
+ print "Content-Type: application/postscript\n\n";
+ }
+ open(FILE, "$i");
+ while (<FILE>) {
+ print "$_";
+ }
+ close FILE;
+ }
+ print "--endpart\n";
+}
+sub urn_error {
+ my($code) = @_; #store failure code here...
+
+ print "Status: $code";
+ print "Content-type: text/html\n\n<HTML>\n";
+ print "<head><title>URN Resolution: I2Rs $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;
+}
+
+
+
+
+
+
+Moats Informational [Page 29]
+
+RFC 2648 A URN Namespace for IETF Documents August 1999
+
+
+Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Moats Informational [Page 30]
+