| < 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/ | ||||