Subject: Re: [URN] "URI Resolution Services" draft
From: Leslie Daigle <[email-masked]>
To: "Karen R. Sollins" <[email-masked]>
Cc: [email-masked], [email-masked], [email-masked]
Date: Tue, 28 Apr 1998 16:22:53 -0400 (EDT)

On Wed, 22 Apr 1998, Karen R. Sollins wrote:
> document out as is.  It seems to me that there is one issue here: the
> definition of "URI".  The document suggests that two specific types of
> URIs are URLs and URNs.  This brings up the whole question of what is

If we want to consider this an issue, I guess the most obvious paragraph
to change would be:

   "Retrieving the resource identified by a Uniform Resource Identifier
    (URI) [1] is only one of the operations that can be performed on a URI.
    One might also ask for and get a list of other identifiers that are
    aliases for the original URI or a bibliographic description of the
    resource the URI denotes, for example. This applies to both Uniform
    Resource Names (URNs) and Uniform Resource Locators (URLs). Uniform
    Resource Characteristics (URCs) are discussed in this document but only
    as descriptions of resources rather than identifiers."

I.e., the last sentence could be rephrased, without loss of generality, 
as:

   "This applies to all forms of URIs; Uniform Resource Characteristics
    (URCs) are discussed in this document but only..."

to sidestep the issue.

However, although that may address the concern about the document (which
has been WG last-called, and got snagged on some formatting issues when
the ADs scrutinized it), I suspect it doesn't get to the heart of your
e-mail -- namely, what's up with URI/URL/URN?

> Can we have a report from someone closely connected to those
> developments, so we can understand where things stand there?  That was
> moving toward someone's definition of URI and we need to decide in
> this document whether we agree with that definition or not.

Without claiming to be closely connected to those developments, as chair
of this WG, I can say that what I've seen evolve out of Jim Gettys' remarks
is a general appreciation for just the point you're getting at:  if the
URI document is representing someone's idea of an identifier model, 
we need to get that definition written down so that it can be discussed
and agreed upon.  Or, it has been suggested that the issue should be stripped
back to pure syntax, and it should be made clear that the underlying
architecture/model/definition is _not_ agreed upon, and no one should claim
that "they have it".

As far as WG strategy is concerned, I think we should keep moving forward on
the assumption that some kind of general understanding will be forthcoming,
and we should not hold up the progress of our own work.

Leslie.

----------------------------------------------------------------------------

  "_Be_                                           Leslie Daigle
             where  you                           
                          _are_."                 Bunyip Information Systems
                                                  (514) 875-8611
                      -- ThinkingCat              [email-masked]
----------------------------------------------------------------------------

Date: Tue, 28 Apr 1998 16:14:22 -0400 (EDT)
From: Leslie Daigle <[email-masked]>
To: "Karen R. Sollins" <[email-masked]>
cc: [email-masked]
Subject: Re: [URN] I came up for air...
Sender: [email-masked]
Reply-To: Leslie Daigle <[email-masked]>

Hello Karen, all,

I am working on the "status of URNs" update that I had promised back
when we cancelled the URN meeting in LA.  In essence, we are done, bar
a few tidying details (such as the ones outlined here, re. "IANA").
There are a few decisions left to be discussed, but I'll leave them
for later mail (when the status report is ready for circulation).

On Wed, 22 Apr 1998, Karen R. Sollins wrote:
> and "or".  But, we do need some commitment from an "authority".  We
> talked about this in Munich last summer, but I don't remember any
> definite conclusion.  Leslie?  Keith?

My current understanding is that, as we are proposing the use of very
mechanical things, it will be appropriate to use whatever IANA-like
structure the IETF has in place.  So, this shouldn't be rocket-science,
it should just be a question of understanding how and where to set up
the mailing addresses.  As you can see already from the structure of the
document, the remaining mechanics should be pretty much identical to
those used for registering MIME media types, MIMEDIR profiles, etc --
a mailing list for a two week review/discussion period, perhaps an IESG
appointed review designatee, and then assignment as appropriate.

> Second, just a minor point - on the URN WG web page, the syntax
> document is listed both as an RFC and as an I-D.  The I-D entry needs
> to be removed to avoid confusing the "masses".  I don't know who
> maintains that page.

The IETF maintains that web page -- another effect is that the list of 
milestones doesn't reflect the update we did (a year ago... ahemm...!).

> Third, there are several other documents, not listed there that are
> relevant to this group, although not put out under our auspices.  The

The documents that are, and should be, listed here are the ones that this
group takes responsibility for.  I agree that the other documents you've
mentioned are relevant to the work being discussed here, but we haven't
officially taken them under our wing, as it were.

> first is John Mallery's PDI document.  When he presented it, I thought
> we discussed using it as our "grandfathered" namespace.  This is not
> to say that Ryan's "IETF documents" document shouldn't be completed
> also.  I think Ryan's note will actually be valuable and should be put
> out.  The PDI work is a better demonstration of scaling issues, so I
> think we should do both.  Ryan put out a new version in April of this

I don't disagree that both should be done.  I don't think there is any
particular advantage to revising the PDI document within this working group
(i.e., update it as regards fragment identifiers, etc, if that's still an
outstanding issue).  What I think _would_ be useful, in the context of htis
group, is the (formal) namespace application for PDI's.    Once the
definition procedures have been nailed down, that can be done either
as part of a revision of his document, or as a separate effort referencing
his PDI document.

> The other documents are the 2 internet drafts written by Lewis Girod,
> Benjie Chen, Henrik Frystyk, and John Mallery, that came out right
> before the last IETF.  I think that should be considered by this
> group.  There clearly are implications both to and from the other work
> going on in this group.  That effort will continue whether or not the
> URN group addresses their questions, but I'd like to see us consider
> the drafts.  They are:
> draft-girod-urn-res-using-wire-00.txt
> draft-girod-w3-id-res-ext-00.txt

As announced, although there was no official meeting in LA, a group of people 
did sit down and discuss these documents in the context of the URN work.  My 
"one paragraph summary" of the URN work in the context of the LA week was 
as follows:

   The URN WG officially did not meet, as there were no agenda items proposed
   to move the work forward.  In context, this indicates that there are few
   remaining issues, and the documents just need finalizing before sending
   them to the IESG.  The hope is to not have to meet in Chicago.  A small
   group of people did meet at the scheduled URN session time to discuss
   the WIRE proposal for an HTTP-based URI resolution system.  This was 
   discussed in the context of whether it illuminated any deficiencies in the 
   existing URN documentation; the authors of that draft (Girod/Neilsen) took 
   away some pointers re. how to make appropriate reference to URN documentation
   (e.g., the URI services document) and no gaping holes were found in the
   existing URN documentation (RDS architecture, etc).

That is, to my knowledge no specific deficiencies with the URN documentation
were highlighted.  So, I think the best plan is to keep the existing body
of URN WG documentation moving forward, and leave it to the authors of these
documents to pursue the implementation/revised description.  Unless there
is general feeling otherwise, I think it's possible to recognize the value
of this work without picking it up as a work item for the group.

Leslie.

----------------------------------------------------------------------------

  "_Be_                                           Leslie Daigle
             where  you                           
                          _are_."                 Bunyip Information Systems
                                                  (514) 875-8611
                      -- ThinkingCat              [email-masked]
----------------------------------------------------------------------------

From: "Ryan Moats" <[email-masked]>
To: "Karen R. Sollins" <[email-masked]>, "[email-masked]" <[email-masked]>
Date: Mon, 27 Apr 98 08:56:40 -0600
Priority: Normal
Subject: [URN] Re: "IETF Documents" i-d
Sender: [email-masked]
Reply-To: "Ryan Moats" <[email-masked]>

On Wed, 22 Apr 1998 17:39:47 -0400, Karen R. Sollins wrote:

>Hi Ryan,
>
>Again, to me this document seems essentially done.  I have only two
>comments and a few typos.
>
>First, as a group, once we have decided who will be reviewing and
>assigning names to namespaces, we can follow the path and figure out
>whether "ietf" will be assigned for this namespace or not.  Actually,
>I suppose this isn't an issue for this document.  It requests "ietf",
>and the authority can decide whether to grant that request or not.

True.  I've just been lurking trying to keep this draft up to date
with the evolving registration process.

>Second, on p. 3 you bring up the question of persistence (and
>indirectly of equality).  Deep in the set of assumptions or
>requirements, or whatever, for URNs is that a URN can identify a
>mutable and mutating or immutable resource.  Our stand is that we do
>not take a stand on this.  The URN will identify a particular resource
>and that assignment cannot change, but the resource may mutate and
>that may even mean that it identifies different piles of immutable
>bits in different places at different times.  Thus, for example, a URN
>might identify the weather at Logan Airport, Boston, at noon, today.
>In the period between midnight and noon, that URN points to no pile of
>bits and between noon and midnight it points to a particular pile of
>bits (for today that would be the weather report for that time and
>place on April 22, 1998, and for tomorrow a different pile for April
>23, 1998).  I think we are actually generally in agreement about this.
>
>In the context of IETF documents, RFCs, STDs, FYIs, and BCPs are all
>REAL resources, and you have given us a way of assigning them URNs.
>RFCs are immutable documents.  The others may be composite and/or
>changing RFCs, but they can still be assigned URNs, just for perhaps
>different sorts of resources.  So, I'd like to see that paragraph
>written something like:
>
>"Persistence of the URNs of this namespace is independent of the
>mutability of the underlying documents.  A URN once assigned willI
>never be reassigned to a different resource; the assignment is
>persistent and immutable.  Distinct from this, the resources
>identified as RFCs are immutable, whereas the other sorts of
>documents, STDs, FYIs, and BCPs are not.  They may be composites of
>one or more RFCs and the set of RFCs that comprise them may change
>with time.  It is important to note that this mutability of some
>resources is independent of the immutability of URN assignment to a
>resource."

I have no problem with this and have replace my text with this.

>
>The typos:
>p. 2: "Further, If a working group or BOF is..." should be "Further,
>if..."
>
>p. 2: "docuent" should be "document"
>
>p. 3: "Assignment of URNs from this namespace occur in two..." should
>be "occurs"

Fixed..

>I should say that I did not read the appendix carefully.

It's perl code, and who wants to read that :-)?

Ryan

Date: Wed, 22 Apr 1998 17:39:47 -0400
From: "Karen R. Sollins" <[email-masked]>
To: [email-masked], [email-masked]
Subject: [URN] "IETF Documents" i-d
Sender: [email-masked]
Reply-To: "Karen R. Sollins" <[email-masked]>

Hi Ryan,

Again, to me this document seems essentially done.  I have only two
comments and a few typos.

First, as a group, once we have decided who will be reviewing and
assigning names to namespaces, we can follow the path and figure out
whether "ietf" will be assigned for this namespace or not.  Actually,
I suppose this isn't an issue for this document.  It requests "ietf",
and the authority can decide whether to grant that request or not.

Second, on p. 3 you bring up the question of persistence (and
indirectly of equality).  Deep in the set of assumptions or
requirements, or whatever, for URNs is that a URN can identify a
mutable and mutating or immutable resource.  Our stand is that we do
not take a stand on this.  The URN will identify a particular resource
and that assignment cannot change, but the resource may mutate and
that may even mean that it identifies different piles of immutable
bits in different places at different times.  Thus, for example, a URN
might identify the weather at Logan Airport, Boston, at noon, today.
In the period between midnight and noon, that URN points to no pile of
bits and between noon and midnight it points to a particular pile of
bits (for today that would be the weather report for that time and
place on April 22, 1998, and for tomorrow a different pile for April
23, 1998).  I think we are actually generally in agreement about this.

In the context of IETF documents, RFCs, STDs, FYIs, and BCPs are all
REAL resources, and you have given us a way of assigning them URNs.
RFCs are immutable documents.  The others may be composite and/or
changing RFCs, but they can still be assigned URNs, just for perhaps
different sorts of resources.  So, I'd like to see that paragraph
written something like:

"Persistence of the URNs of this namespace is independent of the
mutability of the underlying documents.  A URN once assigned will
never be reassigned to a different resource; the assignment is
persistent and immutable.  Distinct from this, the resources
identified as RFCs are immutable, whereas the other sorts of
documents, STDs, FYIs, and BCPs are not.  They may be composites of
one or more RFCs and the set of RFCs that comprise them may change
with time.  It is important to note that this mutability of some
resources is independent of the immutability of URN assignment to a
resource."

The typos:
p. 2: "Further, If a working group or BOF is..." should be "Further,
if..."

p. 2: "docuent" should be "document"

p. 3: "Assignment of URNs from this namespace occur in two..." should
be "occurs"

I should say that I did not read the appendix carefully.

			Karen

Date: Wed, 22 Apr 1998 17:01:13 -0400
From: "Karen R. Sollins" <[email-masked]>
To: [email-masked], [email-masked], [email-masked]
Subject: [URN] "URI Resolution Services" draft
Sender: [email-masked]
Reply-To: "Karen R. Sollins" <[email-masked]>

In this case, I am referring to the recent draft (March, 1998) by
Michael and Ron.

As with the namespace definition i-d, this document is quite close to
being finished, to my thinking.  There is ongoing work that may lead
to some of this being superceded, but I think we still need this
document out as is.  It seems to me that there is one issue here: the
definition of "URI".  The document suggests that two specific types of
URIs are URLs and URNs.  This brings up the whole question of what is
going on with the URL document that Roy was working on, that Jim
Gettys and others pushed so hard to convert to a "URI" document, that
could be moved to the next stage of standardization, so that HTTP
could refer to it in its next stage of standardization.

Can we have a report from someone closely connected to those
developments, so we can understand where things stand there?  That was
moving toward someone's definition of URI and we need to decide in
this document whether we agree with that definition or not.

Other than that, I found two minor typos, both on p. 2.  First,
"Thus, this document will list several operations, as well as, lay out
requirements..."  Remove the "," after "as well as".  Second,
"criteria" should be "criterion" since there is only one here.

Otherwise, I think we should go for it with this document.

			Karen

Date: Wed, 22 Apr 1998 16:51:01 -0400
From: "Karen R. Sollins" <[email-masked]>
To: [email-masked]
Subject: [URN] I came up for air...
Sender: [email-masked]
Reply-To: "Karen R. Sollins" <[email-masked]>

I just came up for air and decided to take a little time to review
where things stand in the URN working group.  In general, it seems to
me that we are coming along really well.  I have comments on a couple
of the outstanding internet drafts and a few other comments.  In this
note I'll do the general stuff and then send out followup notes on the
two specific internet drafts where I have comments, in hopes of
separating any discussions.

First, from my point of view the "process" internet draft, "URN
Namespace Definition Mechanisms" is basically done, except that some
decision needs to be made about who the "authority" (callend "IANA" in
the document) will be.  Otherwise there is one "typo" and I think we
should call it done.  The correction is in the first line of "Process
of identifier assignment" where there should be a "/" between "and"
and "or".  But, we do need some commitment from an "authority".  We
talked about this in Munich last summer, but I don't remember any
definite conclusion.  Leslie?  Keith?

Second, just a minor point - on the URN WG web page, the syntax
document is listed both as an RFC and as an I-D.  The I-D entry needs
to be removed to avoid confusing the "masses".  I don't know who
maintains that page.

Third, there are several other documents, not listed there that are
relevant to this group, although not put out under our auspices.  The
first is John Mallery's PDI document.  When he presented it, I thought
we discussed using it as our "grandfathered" namespace.  This is not
to say that Ryan's "IETF documents" document shouldn't be completed
also.  I think Ryan's note will actually be valuable and should be put
out.  The PDI work is a better demonstration of scaling issues, so I
think we should do both.  Ryan put out a new version in April of this
year, and I'll send a separate note with comments on that.  I have not
talked with John Mallery about the PDI document and he's away for the
next couple of weeks, but as a plan for the group, I'd like to propose
that we get both of them out as Informational RFCs before we close up
shop.

The other documents are the 2 internet drafts written by Lewis Girod,
Benjie Chen, Henrik Frystyk, and John Mallery, that came out right
before the last IETF.  I think that should be considered by this
group.  There clearly are implications both to and from the other work
going on in this group.  That effort will continue whether or not the
URN group addresses their questions, but I'd like to see us consider
the drafts.  They are:
draft-girod-urn-res-using-wire-00.txt
draft-girod-w3-id-res-ext-00.txt

Comments?  Reactions?

			Karen

To: IETF-Announce: ;
Cc: [email-masked]
From: [email-masked]
Subject: [URN] I-D ACTION:draft-ietf-urn-ietf-04.txt
Date: Thu, 16 Apr 1998 09:44:18 -0400
Sender: [email-masked]
Reply-To: [email-masked]

--NextPart

Note:  This announcement is being re-sent with a correction made.

A New Internet-Draft is available from the on-line Internet-Drafts directories.
This draft is a work item of the Uniform Resource Names Working Group of the IETF.

	Title		: A URN Namespace for IETF Documents
	Author(s)	: R. Moats
	Filename	: draft-ietf-urn-ietf-04.txt
	Pages		: 21
	Date		: 14-Apr-98
	
   A system for Uniform Resource Names (URNs) must be capable of
   supporting new naming systems.  As an example of proposing a new
   namespace, this document proposes the 'ietf' namespace.  This
   namespace consists of the RFC family of documents (RFCs, STDs, FYIs,
   and BCPs) developed by the IETF and published by the RFC editor and
   the minutes of working groups (WG) and birds of a feather (BOF)
   meetings that occur during IETF conferences.  Both the current URN
   framework and URN syntax support this namespace.

Internet-Drafts are available by anonymous FTP.  Login with the username
"anonymous" and a password of your e-mail address.  After logging in,
type "cd internet-drafts" and then
	"get draft-ietf-urn-ietf-04.txt".
A URL for the Internet-Draft is:
ftp://ftp.ietf.org/internet-drafts/draft-ietf-urn-ietf-04.txt

Internet-Drafts directories are located at:

	Africa:	ftp.is.co.za
	
	Europe: ftp.nordu.net
		ftp.nis.garr.it
			
	Pacific Rim: munnari.oz.au
	
	US East Coast: ftp.ietf.org
	
	US West Coast: ftp.isi.edu

Internet-Drafts are also available by mail.

Send a message to:	[email-masked].  In the body type:
	"FILE /internet-drafts/draft-ietf-urn-ietf-04.txt".
	
NOTE:	The mail server at ietf.org can return the document in
	MIME-encoded form by using the "mpack" utility.  To use this
	feature, insert the command "ENCODING mime" before the "FILE"
	command.  To decode the response(s), you will need "munpack" or
	a MIME-compliant mail reader.  Different MIME-compliant mail readers
	exhibit different behavior, especially when dealing with
	"multipart" MIME messages (i.e. documents which have been split
	up into multiple messages), so check your local documentation on
	how to manipulate these messages.

Below is the data which will enable a MIME compliant mail reader
implementation to automatically retrieve the ASCII version of the
Internet-Draft.

--NextPart
Content-Type: Multipart/Alternative; Boundary="OtherAccess"

--OtherAccess
Content-Type: Message/External-body;
	access-type="mail-server";
	server="[email-masked]"

Content-Type: text/plain
Content-ID:	<[email-masked]>

ENCODING mime
FILE /internet-drafts/draft-ietf-urn-ietf-04.txt

--OtherAccess
Content-Type: Message/External-body;
	name="draft-ietf-urn-ietf-04.txt";
	site="ftp.ietf.org";
	access-type="anon-ftp";
	directory="internet-drafts"

Content-Type: text/plain
Content-ID:	<[email-masked]>

--OtherAccess--

--NextPart--

To: IETF-Announce: ;
Cc: [email-masked]
From: [email-masked]
Subject: [URN] I-D ACTION:draft-ietf-urn-ietf-04.txt
Date: Wed, 15 Apr 1998 10:33:40 -0400
Sender: [email-masked]
Reply-To: [email-masked]

--NextPart

A New Internet-Draft is available from the on-line Internet-Drafts directories.
This draft is a work item of the Uniform Resource Names Working Group of the IETF.

	Title		: A URN Namespace for IETF Documents
	Author(s)	: R. Moats
	Filename	: draft-ietf-urn-ietf-04.txt
	Pages		: 21
	Date		: 14-Apr-98
	
   This document specifies an extension of the Routing Information
   Protocol (RIP), as defined in [1], to expand the amount of useful
   information carried in RIP messages and to add a measure of security.
 
   A companion document will define the SNMP MIB objects for RIP-2 [2].
   An additional document will define cryptographic security
   improvements for RIP-2 [3].

Internet-Drafts are available by anonymous FTP.  Login with the username
"anonymous" and a password of your e-mail address.  After logging in,
type "cd internet-drafts" and then
	"get draft-ietf-urn-ietf-04.txt".
A URL for the Internet-Draft is:
ftp://ftp.ietf.org/internet-drafts/draft-ietf-urn-ietf-04.txt

Internet-Drafts directories are located at:

	Africa:	ftp.is.co.za
	
	Europe: ftp.nordu.net
		ftp.nis.garr.it
			
	Pacific Rim: munnari.oz.au
	
	US East Coast: ftp.ietf.org
	
	US West Coast: ftp.isi.edu

Internet-Drafts are also available by mail.

Send a message to:	[email-masked].  In the body type:
	"FILE /internet-drafts/draft-ietf-urn-ietf-04.txt".
	
NOTE:	The mail server at ietf.org can return the document in
	MIME-encoded form by using the "mpack" utility.  To use this
	feature, insert the command "ENCODING mime" before the "FILE"
	command.  To decode the response(s), you will need "munpack" or
	a MIME-compliant mail reader.  Different MIME-compliant mail readers
	exhibit different behavior, especially when dealing with
	"multipart" MIME messages (i.e. documents which have been split
	up into multiple messages), so check your local documentation on
	how to manipulate these messages.

Below is the data which will enable a MIME compliant mail reader
implementation to automatically retrieve the ASCII version of the
Internet-Draft.

--NextPart
Content-Type: Multipart/Alternative; Boundary="OtherAccess"

--OtherAccess
Content-Type: Message/External-body;
	access-type="mail-server";
	server="[email-masked]"

Content-Type: text/plain
Content-ID:	<[email-masked]>

ENCODING mime
FILE /internet-drafts/draft-ietf-urn-ietf-04.txt

--OtherAccess
Content-Type: Message/External-body;
	name="draft-ietf-urn-ietf-04.txt";
	site="ftp.ietf.org";
	access-type="anon-ftp";
	directory="internet-drafts"

Content-Type: text/plain
Content-ID:	<[email-masked]>

--OtherAccess--

--NextPart--

From: "Ryan Moats" <[email-masked]>
To: "URN mailing list" <[email-masked]>, "i-d editor" <[email-masked]>
Date: Mon, 13 Apr 98 10:49:05 -0600
Priority: Normal
Subject: [URN] New ietf namespace draft (-04)
Sender: [email-masked]
Reply-To: "Ryan Moats" <[email-masked]>

I-D editor:

Included is draft-ietf-urn-ietf-04.txt to replace -03 in the archives.  Thanks

Folks-

Right before LA, I received some input on adding the BCP series to 
this namespace.  In addition, I've tried to clean up the listing in the
appendix so they actually work.

Ryan

Internet-Draft                                                Ryan Moats
draft-ietf-urn-ietf-04.txt                                          AT&T
Expires in six months                                         April 1998
pl 10.0i

                   A URN Namespace for IETF Documents
                  Filename: draft-ietf-urn-ietf-04.txt

Status of This Memo

      This document is an Internet-Draft.  Internet-Drafts are working
      documents of the Internet Engineering Task Force (IETF), its
      areas, and its working groups.  Note that other groups may also
      distribute working documents as Internet-Drafts.

      Internet-Drafts are draft documents valid for a maximum of six
      months and may be updated, replaced, or obsoleted by other
      documents at any time.  It is inappropriate to use Internet-
      Drafts as reference material or to cite them other than as ``work
      in progress.''

      To learn the current status of any Internet-Draft, please check
      the ``1id-abstracts.txt'' listing contained in the Internet-
      Drafts Shadow Directories on ftp.is.co.za (Africa), nic.nordu.net
      (Europe), munnari.oz.au (Pacific Rim), ds.internic.net (US East
      Coast), or ftp.isi.edu (US West Coast).

Abstract

   A system for Uniform Resource Names (URNs) must be capable of
   supporting new naming systems.  As an example of proposing a new
   namespace, this document proposes the "ietf" namespace.  This
   namespace consists of the RFC family of documents (RFCs, STDs, FYIs,
   and BCPs) developed by the IETF and published by the RFC editor and
   the minutes of working groups (WG) and birds of a feather (BOF)
   meetings that occur during IETF conferences.  Both the current URN
   framework and URN syntax support this namespace.

0.1 Changes from -02

   This document has been restructured to use the template proposed in
   draft-ietf-urn-nid-req-03.txt.  Example Perl scripts for resolving
   this namespace have been supplied in an Appendix.

0.2 Changes from -03

   Text was added to the template clarifying persistence and uniqueness.
   Support for the BCP document series added to the examples and the
   ABNF.

Expires 10/31/98                                                [Page 1]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

1. Introduction

   This document proposes the "ietf" namespace, which consists of the
   RFC family of documents (RFCs, STDs, FYIs, and BCPs) developed by the
   IETF and published by the RFC editor and the minutes of working
   groups (WG) and birds of a feather (BOF) meetings that occur during
   IETF conferences.

   The namespace specification is for a formal namespace.

2. Specification Template

     Namespace ID:

          "ietf" requested.

     Declared registrant of the namespace:

          Ryan Moats
          [email-masked]

     Declaration of structure:

          The identifier has the following ABNF [2] specification:

          NSS = (family ":" number) / ("mtg-" number "-" wgbofname)
          family = "rfc" / "std" / "fyi" / "bcp"
          number = 1*DIGIT
          wgbofname = 1*LETDIGIT
          LETDIGIT = DIGIT / %x41..%x5a / %x61..%x7a
          DIGIT = %x30..%x39

          If the IESG (or it successor) adds a new document
          series, this ABNF specification will need to be
          updated.  Further, If a working group or BOF is
          created that used characters outside the range of this
          ABNF specification, this specification will need to be
          updated.  Any system intended to resolve names for
          this namespace should be written with the awareness
          that this could occur at any time.

     Identifier uniqueness considerations:

          Because the rfc-editor assigns the RFC number uniquely
          these URNs are unique.  Since the mapping between RFCs
          and other rfc-editor docuent series (STDs, FYIs or
          BCPs) is not necessarily one-to-one, uniqueness of
          STDs, FYIs and BCPs are defined based on the document
          mappings maintained by the RFC Editor (the index files
          "rfc-index.txt", "fyi-index.txt", "bcp-index.txt" and
          "std-index.txt") are defined to be the definitive
          statement of the assignment of RFC Family URNs in this
          namespace.  The meeting minutes portion of the
          namespace is guaranteed unique because the URN

Expires 10/31/98                                                [Page 2]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

          includes the sequence number of the IETF conference.

     Identifier persistence considerations:

          Persistence of the URNs of this namespace is dependent
          on the persistence of the underlying documents. The
          fundamental difference between RFCs on one hand and
          STDs, FYIs, or BCPs on the other is that only RFCs are
          real, even persistent, documents while the others are
          just names for sets of one or more RFCs which may
          change over time.

     Process of identifier assignment:

          Assignment of URNs from this namespace occur in two
          ways.  The first is when a new RFC, FYI, STD or BCP is
          passed by the IESG and published by the RFC
          Editor. This new document will have a new series
          number and will therefore define a new URN.  The
          document mappings maintained by the RFC Editor (the
          index files "rfc-index.txt", "fyi-index.txt",
          "bcp-index.txt" and "std-index.txt") are defined to be
          the definitive statement of the assignment of RFC
          Family URNs in this namespace.

          The second way a URN is assigned is when a working
          group or birds of a feather files meeting minutes as
          part of an IETF conference.  The list of minutes
          maintained by the IETF for each working group and
          conference in the subtree pointed at by the URL
          ftp://ietf.org/ietf/ is considered the definitive
          assignment of URNs for working group or birds of a
          feather minutes.

     Process of identifier resolution:

          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.

     Rules for Lexical Equivalence:

          The entire URN is case-insensitive.

     Conformance with URN Syntax:

          There are no additional characters reserved.

     Validation mechanism:

          None specified.

Expires 10/31/98                                                [Page 3]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

     Scope:

          Global.

3. Security Considerations

   Because this namespace defines no additional reserved characters, it
   does not add any security considerations beyond those inherent from
   the existence of the reserved characters from [1].  Further, none of
   the reserved characters from [1] are used in the definition of the
   NSS. This means that resolvers for this namespace may be considered
   "secure" in the sense that any escaping of characters in the NSS MUST
   result in the resolver indicating that the URN has incorrect syntax.

4. Acknowledgments

   Thanks to various members of the URN working group for comments on
   earlier drafts of this document.  The work described in this document
   is partially supported by the National Science Foundation,
   Cooperative Agreement NCR-9218179.

4. References

   Request For Comments (RFC) and Internet Draft documents are available
   from <URL:ftp://ftp.internic.net> and numerous mirror sites.

[1]         R. Moats, "URN Syntax," RFC 2141, May 5, 1997.

[2]         D. Crocker, P. Overell, "Augmented BNF for Syntax Specifica-
            tions: ABNF," Internet Draft (work in progress), January
            1997.

5. Author's Address

   Ryan Moats
   AT&T
   15621 Drexel Circle
   Omaha, NE 68135-2358
   USA

   Phone:  +1 402 894-9456
   EMail:  [email-masked]

Appendix A.  Example Resolution Scripts

   The following scripts are examples that can be used for resolving
   URNs in this namespace.

A.1 I2C

     #!/usr/local/bin/perl

     use strict;

Expires 10/31/98                                                [Page 4]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

     #
     # this is a URN 2 URC 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) = (
       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

     (&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 "HTTP/1.0 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 "HTTP/1.0 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";

Expires 10/31/98                                                [Page 5]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

         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,$_;
         }
       }

       if ($scheme ne "rfc") {
         print "HTTP/1.0 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;

Expires 10/31/98                                                [Page 6]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

           }
         }
         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 "HTTP/1.0 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";

Expires 10/31/98                                                [Page 7]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

     }

     sub urn_error {
       my($code) = @_; #store failure code here...

       print "HTTP/1.0 $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;
     };

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",
     );

     my(%number2date) = (
       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

     (&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 {

Expires 10/31/98                                                [Page 8]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

       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 "HTTP/1.0 302 Moved temporarily\n";
         print "Location: $link\n";
         return;
       }
       my($link)="$wgpath/$date/$sesnam-minutes-$date.txt";
       if (-f $link) {
         print "HTTP/1.0 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 resolve1 {
       my($flag,@bib,$i,$k,$j,$done,@ref);
       my($l,$link);
       my($scheme, $value) = @_;
       $scheme =~ tr/A-Z/a-z/;
       &urn_error("404 Not Found\n")if (!defined $pathbase{$scheme});
       my($txttry)="/ftp/$pathbase{$scheme}$value.txt";
       my($pstry)="/ftp/$pathbase{$scheme}$value.ps";
       my($htmltry)="/ftp/$pathbase{$scheme}$value.html";
     MIME_SWITCH: {
         if ($accept =~ /application\/postscript/ && -f $pstry) {
           print "HTTP/1.0 302 Moved temporarily\n";
           print "Location: http://$host/$pathbase{$scheme}$value.ps\n\n";
           last MIME_SWITCH;
         }
         if ($accept =~ /text\/html/ && -f $htmltry) {
           print "HTTP/1.0 302 Moved temporarily\n";
           print "Location: http://$host/$pathbase{$scheme}$value.html\n\n";
           last MIME_SWITCH;
         }
         if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) {
           print "HTTP/1.0 302 Moved temporarily\n";
           print "Location: http://$host/$pathbase{$scheme}$value.txt\n\n";
           last MIME_SWITCH;
         }
         &urn_error("404 Not Found\n");
       }
     }

Expires 10/31/98                                                [Page 9]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

     sub urn_error {
       my($code) = @_; #store failure code here...

       print "HTTP/1.0 $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;
     }

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"
     );

     my(%number2date) = (
       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

     (&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");

Expires 10/31/98                                               [Page 10]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

     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 "HTTP/1.0 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 "HTTP/1.0 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 "HTTP/1.0 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 "HTTP/1.0 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";

Expires 10/31/98                                               [Page 11]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

           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 "HTTP/1.0 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 "HTTP/1.0 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";

Expires 10/31/98                                               [Page 12]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

           }
           print "</UL>\n</body>\n</HTML>\n";
           last MIME_SWITCH;
         }
       }
     }

     sub urn_error {
       my($code) = @_; #store failure code here...

       print "HTTP/1.0 $code";
       print "Content-type: text/html\n\n<HTML>\n";
       print "<head><title>URN Resolution: I2Ls $code</title></head>\n";
       print "<BODY>\n";
       print "<h1>URN to URL resolution failed for the URN:</h1>\n";
       print "<hr><h3>$urn</h3>\n";
       print "</body>\n";
       print "</html>\n";
       exit;
     }

A.4 I2Ns

     #!/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) = (
       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

Expires 10/31/98                                               [Page 13]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

     (&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 "HTTP/1.0 200 OK\n";
             print "Content-type: text/uri-list\n\n\n";
             print "#$urn\n";
             return;
         }
         if ($accept =~ /\*\/\*|text\/html/) {
           print "HTTP/1.0 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 "HTTP/1.0 200 OK\n";
             print "Content-type: text/uri-list\n\n\n";
             print "#$urn\n";
             return;
         }
         if ($accept =~ /\*\/\*|text\/html/) {
             print "HTTP/1.0 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$/);

Expires 10/31/98                                               [Page 14]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

       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 "HTTP/1.0 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 "HTTP/1.0 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";

Expires 10/31/98                                               [Page 15]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

                 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 "HTTP/1.0 $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 URC resolution failed for the URN:</h1>\n";
       print "<hr><h3>$urn</h3>\n";
       print "</body>\n";
       print "</html>\n";
       exit;
     };

A.5 I2R

     #!/usr/local/bin/perl

     use strict;

     #
     # this is a URN 2 resource resolver for the ietf namespace
     #

     my(%pathbase) = (
       rfc => "rfc/rfc",
       fyi => "fyi/fyi",
       std => "std/std",
       bcp => "bcp/bcp"
     );

     my(%number2date) = (
       41 => "98apr",
       40 => "97dec", 39 => "97aug", 38 => "97apr",
       37 => "96dec", 36 => "96jun", 35 => "96mar",

Expires 10/31/98                                               [Page 16]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

       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

     (&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 "HTTP/1.0 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 "HTTP/1.0 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 {

Expires 10/31/98                                               [Page 17]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

       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 "HTTP/1.0 200 OK\n";
           print "Content-type: application/postscript\n\n";
           open(FILE, "$pstry");
           while (<FILE>) {
               print $_;
           }
           close FILE;
           last MIME_SWITCH;
         }
         if ($accept =~ /text\/html/ && -f $htmltry) {
             print "HTTP/1.0 200 OK\n";
             print "Content-type: text/html\n\n";
             open(FILE, "$htmltry");
             while (<FILE>) {
                 print $_;
             }
             close FILE;
             last MIME_SWITCH;
         }
         if ($accept =~ /\*\/\*|text\/plain/ && -f $txttry) {
             print "HTTP/1.0 200 OK\n";
             print "Content-type: text/plain\n\n";
             open(FILE, "$txttry");
             while (<FILE>) {
                 print $_;
             }
             close FILE;
             last MIME_SWITCH;
         }
         &urn_error("404 Not Found\n");
       }
     }

     sub urn_error {
       my($code) = @_; #store failure code here...

       print "HTTP/1.0 $code";
       print "Content-type: text/html\n\n<HTML>\n";
       print "<head><title>URN Resolution: I2R $code</title></head>\n";
       print "<BODY>\n";
       print "<h1>URN to URL resolution failed for the URN:</h1>\n";
       print "<hr><h3>$urn</h3>\n";
       print "</body>\n";
       print "</html>\n";

Expires 10/31/98                                               [Page 18]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

       exit;
     }

A.6 I2Rs

     #!/usr/local/bin/perl

     use strict;

     #
     # this is a URN 2 resources resolver for the ietf namespace
     #

     my(@urls);

     my(%pathbase) = (
       rfc => "rfc/rfc",
       fyi => "fyi/fyi",
       std => "std/std",
       bcp => "bcp/bcp"
     );

     my(%number2date) = (
       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

     (&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);

Expires 10/31/98                                               [Page 19]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

       }
       &urn_error("404 Not Found\n") if ($#vers==-1);

       print "HTTP/1.0 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 "HTTP/1.0 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$/) {

Expires 10/31/98                                               [Page 20]

INTERNET DRAFT     A URN Namespace for IETF Documents         April 1998

               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 "HTTP/1.0 $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;
     }

Expires 10/31/98                                               [Page 21]