RFC 2648
A URN Namespace for IETF Documents
RFC 2648: A URN Namespace for IETF Documents π
okay bestie, this is RFC 2648 and it's giving "official IETF paperwork but make it iconic" π
Written by Ryan Moats from AT&T, in August 1999. It's Informational π¦, which means it shares info for the Internet community and doesn't set any actual Internet standard. The header doesn't list anything it obsoletes or updates, so it's standing on its own. πΈ
Status of this Memo π
This memo gives info to the Internet community. It does not specify an Internet standard of any kind π ββοΈ. Distribution is totally unlimited, so share it with everyone π
Copyright Notice Β©οΈ
Copyright (C) The Internet Society (1999). All Rights Reserved β¨
Abstract π
okay so a URN system needs to be able to support brand new naming systems π§. To show how that works, this doc proposes the "ietf" namespace π. It covers the RFC family of docs (RFCs, STDs, FYIs, and BCPs) made by the IETF and published by the RFC Editor π, plus the minutes from working group (WG) and birds of a feather (BOF) meetings at IETF conferences π, plus the Internet-Drafts published by the Internet-Drafts Editor π. The current URN framework and URN syntax both support this namespace, so it's all good to go π«Ά
1. Introduction π
This doc proposes the "ietf" namespace, which is the RFC family of docs (RFCs, STDs, FYIs, and BCPs) developed by the IETF and published by the RFC editor, plus the minutes of working groups (WG) and birds of a feather (BOF) meetings at IETF conferences π
The namespace spec is for a formal namespace π§
2. Specification Template π
Namespace ID:
"ietf" requested. β¨
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 / "-")
Okay so here's the tea β. If the IESG (or it successor) adds a new document series, this ABNF spec will need an update π. Same deal if a working group or BOF shows up using characters outside this ABNF's range π. So any system that resolves names for this namespace should be built knowing this could happen at any time π
Main character energy: resolvers have to expect the unexpected! π
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 /);
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) {
$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;
};
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");
}
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";
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");
}
}
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");
}
}
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) {
$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";
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";
}
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");
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 β¨
Okay bestie, the next resolver is I2Ns, and it's giving citation-index energy π Here's the whole thing, no cap:
#!/usr/local/bin/perl
use strict;
#
# this is a URN 2 URNs resolver for the ietf namespace
#
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";
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) {
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";
}
}
}
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 π¦
Last but not least, I2R is the one that actually goes and gets the resource for you, periodt π
#!/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",
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");
}
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";
A.6 I2Rs β¨
okay bestie, this is the I2Rs resolver, the URN-to-resources script for the ietf namespace π π
#!/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'};
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);
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) {
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;
}
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. π«Ά
π¦ where this page comes from
- ietf: rfc2648 1999-08
- π girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms