Network Working Group TL Laugstol
Internet-Draft Arktekk
Expires: May 14, 2012 November 2011

The Apache Maven Repository REST Applications and Protocol Bindings
draft-apache-maven-repository-rest-applications-01

Abstract

This document describe an architecture for a set of applications can access Maven repositories. The architecture is defined within the constrains of REST. Each application describe a useful interaction between a server and a client and the architecture ties the applications together with common traits and constraints.

Status of this Memo

This document is an Internet-Draft and is NOT offered inaccordance with Section 10 of RFC 2026, and the author does not provide the IETF with any rights other than to publish as an Internet-Draft.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet- Drafts is at http://datatracker.ietf.org/drafts/current/.

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."

This Internet-Draft will expire on May 14, 2012.


Table of Contents

1. TODOs and Notes

1.1. Artifact Repository

Should this whole thing be turned into a more generic "artifact repository". This would make it easier to support repositories for particular scala versions (so you won't have to highjack Maven's semantics with artifactId = realArtifactId + "_" + scalaVersion.

It would also be easier to add support for extra attributes like "build number", "jenkins build", "henkins job name" and "build timestamp".

How should these attributes be describes? One possible option is a "profile" per repository that describe the possible attributs. You'd get a "maven profile", "jenkins profile"/"ci profile" etc. Does the values imply special values? Could a "maven profile" specify that 'if you upload an artifact with build-number set to next the server will pick the next available build number'. Having the server to a lot of work is in the vain of making it easier to implement user agents, but at the same time you're specifying semantics that are to be valid for all times.

I guess it all comes down to how much should be put in as attachments to an artifact vs how much should these applications be involved.

If this is to be done specify bindings for Maven Artifacts, Scala Artifacts (basically Maven Artifacts + scala version), Sbt Plugin Artifacts, Debian packages, OpenCSW packages.

2. Introduction

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119].

2.1. Goals:

2.2. Implementation goals

2.3. Areas explicitly not covered

This specification will not apply to the existing static Maven repositories.That would be impossible within reason and there are already enough tools to support that kind of repositories. However, it inside this specification to be able to create an application that support the operations while still points to a static repository for providing the actual artifacts.

2.4. Deployment scenarios

3. Specification

3.1. Repository Concepts

3.2. Media Types

TODO: Find a reference to @mamund's "you should always design a new media type (but not format)".

3.3. Operations

3.4. Uploading Artifacts

It should be possible to:

3.5. Downloading Artifacts

3.5.1. Download a single artifact

Steps to download a single artifact with a specific version:

Download the start resource and find a form named download-artifact.

Artifacts can be identified either through an artifact URN or a full set of coordinates. To use the URN mechanism fill out the urn field, to use the coordinate version fill out the fields named groupId, artifactId, version, type and classifier. The classifier field is optional. These fields MUST be present in the form.

TODO: Some possible optional controls: filename.

Submit the form. The server MAY return a single artifact, see Section 5.4.1.

3.5.2. Download a set of artifacts

The set might be a search, or just a list of artifacts. The server is free to choose to send a container format with all the files in it, or just an URL list with pointers.

3.6. Searching

Servers SHOULD implement conditional controls so it's possible to poll the server regularly.

TODO: specify how to query for only changes after a certain timestamp.

3.7. List Repositories

4. Security Aspects

4.1. Authentication and Authorization

Authentication and authorization is generally not specified by this specification as it is assumed that the transport mechanisms will specify the different options for authentication.

5. User-Agent Considerations

5.1. Caching

A user-agent should include information on how stale data it allows when requesting artifacts. This make it possible for caches to include caching information in the return response that intermediates also will use.

TODO: Are there any standard ways in HTTP to do this?

A user agent must always check that it got the data it required after receiving a response. This means checking response code and content type in particular.

User agents should implement a way to force an updated answer from the server, similar to what contemporary web browser to when the user explicitly reloads a page. For HTTP this includes sending a max-age=0 when requesting the data. This spesification specifically allows servers to send 410 Gone (See HTTP/1.1, Section 10.4.11) for artifacts that it knows won't ever come. A case where this is useful is if an artifact is uploaded and it's sources and javadoc artifacts are not there. A user agent MUST use any caching info given with the response. By specification the response can be cached forever.

TODO: Add info on 305 Use Proxy, section 10.3.6 of HTTP/1.1.

5.2. Multiple links

If a response include many links with the same relation and content type, it should can try all links to get the data. This makes it possible for a server to include pointers to many servers that can respond to the same request. A user agent should try to stick to the same host (as defined by the URI) for the following requests.

TODO: It this mainly covered by metalink?

5.3. Forms

When the user agent is downloading a form with unknown controls they MUST be sent back to the server with any value specified.

5.4. Server Responses

5.4.1. Single Artifact

HTTP responses SHOULD include a Content-Disposition header with Disposition Type set to attachment to indicates that the artifact shouldn't be processed according to its media type. See also Content-Disposition in HTTP [RFC6266]. Those implementations that use generic HTTP servers to serve the artifacts might not include the header as it could be shared between many applications.

5.4.2. Multiple Artifacts

When the server replies with a set of artifacts it MAY send one of the following responses. If the response is one of the specified responses, it MUST follow this specification.

5.4.2.1. text/uri-list

See the text/uri-list specification [RFC2483].

TODO: Specify application/atom+xml, text/collection+json responses too.

5.5. HTTP Binding

Explain what extra headers can be given with each response for artifacts:

6. Appendix: Words and Definitions

Maven Repository
A Maven Repository contain a set of artifacts. Each artifact is identified by a:

See Also (The Maven site at apache)[http://maven.apache.org]

7. Security Considerations

8. IANA Considerations

8.1. Link Relation: http://maven.apache.org/rel/pom

A pointer to a Maven POM file.

TODO: Should probably not be here, a link with rel=describedby, contentType=text/vnd.maven.pom is probably fine.

8.2. Link Relation: http://maven.apache.org/rel/md5

8.3. Link Relation: http://maven.apache.org/rel/sha1

8.4. Media Type: text/vnd.maven.pom

8.5. Media Type: text/vnd.maven.md5

8.6. Media Type: text/vnd.maven.sha1

8.7. URN Registration: urn:maven:artifact

Should it be urn:maven:artifact, urn:maven or urn:artifact-repository.

Use template in http://tools.ietf.org/html/rfc3406#appendix-A

Creating an informal registration seems the right way to do as long as this document doesn't become an RFC.

URN notes:

9. Security Considerations

10. Acknowledgments

11. References

11.1. Normative References

[RFC1864] Myers, J. and M. Rose, "The Content-MD5 Header Field", RFC 1864, October 1995.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC2483] Mealling, M. and R. Daniel, "URI Resolution Services Necessary for URN Resolution", RFC 2483, January 1999.
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
[RFC3230] Mogul, J. and A. Van Hoff, "Instance Digests in HTTP", RFC 3230, January 2002.
[RFC4287] Nottingham, M. and R. Sayre, "The Atom Syndication Format", RFC 4287, December 2005.
[RFC4627] Crockford, D., "The application/json Media Type for JavaScript Object Notation (JSON)", RFC 4627, July 2006.
[RFC5854] Bryan, A., Tsujikawa, T., McNab, N. and P. Poeml, "The Metalink Download Description Format", RFC 5854, June 2010.
[RFC6249] Bryan, A., McNab, N., Tsujikawa, T., Poeml, P. and H. Nordstrom, "Metalink/HTTP: Mirrors and Hashes", RFC 6249, June 2011.
[RFC6266] Reschke, J., "Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)", RFC 6266, June 2011.

11.2. Informative References

[RFC1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April 1992.
[RFC3174] Eastlake, D. and P. Jones, "US Secure Hash Algorithm 1 (SHA1)", RFC 3174, September 2001.
[RFC3406] Daigle, L., van Gulik, D., Iannella, R. and P. Faltstrom, "Uniform Resource Names (URN) Namespace Definition Mechanisms", BCP 66, RFC 3406, October 2002.

Author's Address

Trygve Arktekk NO Phone: +47 926 99 070 EMail: trygvis@inamo.no