URI

Hippo2000 (2000/7/28)

URIモジュールなのです。

作者はGisle Aasさんです。メールで許可をいただきました。

なおURIモジュールには以下のサブクラスがあります。

クラス名 説 明
URI::data 直にデータを持っているURI
URI::Escape 安全でない文字のエスケープとアンエスケープ
URI::file ローカル・ファイル名に対応するURI
URI::Heuristic 学習を使ったURIの展開
URI::ldap LDAP 定型資源位置(Uniform Resource Locators )
URI::URL 定型資源位置(Uniform Resource Locators)
URI::WithBase そのベースを覚えるURI

目次


名前

URI - 定型資源識別子(Uniform Resource Identifiers) (絶対そして相対)


概要

 $u1 = URI->new("http://www.perl.com";);
 $u2 = URI->new("foo", "http");
 $u3 = $u2->abs($u1);
 $u4 = $u3->clone;
 $u5 = URI->new("HTTP://WWW.perl.com:80";)->canonical;
 $str = $u->as_string;
 $str = "$u";
 $scheme = $u->scheme;
 $opaque = $u->opaque;
 $path   = $u->path;
 $frag   = $u->fragment;
 $u->scheme("ftp");
 $u->host("ftp.perl.com");
 $u->path("cpan/");

説明

このモジュールはURIクラスを実装します。このクラスのオブジェクトはRFC 2396で指定されている定型資源識別子("Uniform Resource Identifier references")を表わしています。

定型資源識別子(Uniform Resource Identifier)は抽象的あるいは物理的リソースを識別するための文字のコンパクトな文字列です。Uniform Resource IdentifierはさらにUniform Resource Locator (URL) と Uniform Resource Name (URN)に分類することができます。URLとURNの違いはURIクラス・インターフェースには関係ありません。"URI-reference"はURIで、フラグメント識別子の形式に付けられる追加の情報を持っているかもしれません。

絶対URIリファレンスは3つの部分で構成されます。スキーム(scheme)、スキーム独自部分(scheme specific part)、そしてフラグメント識別子です。URIリファレンスのサブセットは階層的名前空間のための共通の文法を共有します。これらのためスキーム独自部分は、さらにauthority, path そしてquery 要素に分けられます。これらのURIは相対URIリファレンスの形式を取ることもできます。そこではscheme(そして通常はauthorityも)要素がなく、しかしURIリファレンスの文脈により暗黙のうちに決められています。URIリファレンスの書式の3つの形式は、以下のようにまとめることができます:

  <scheme>:<scheme-specific-part>#<fragment>
  <scheme>://<authority><path>?<query>#<fragment>
  <path>?<query>#<fragment>

URIリファレンスの構成要素はスキームに依存して分割されます。URIクラスは個々の構成要素を取得し、設定するメソッドを提供します。特定のURIオブジェクトのために利用できるメソッドはスキームに依存します。


コンストラクタ

以下のメソッドが新しいURIオブジェクトを組み立てます:

$uri = URI->new( $str, [$scheme] )
このクラス・メソッドは新しいURIオブジェクトを組み立てます。URIの文字列表現が引数として、オプションのスキーム指定とともに与えられます。""や<>のような共通のURIラッパ、そして前や後ろにつく空白は、さらに処理される前に自動的に$str引数から削除されます。

コンストラクタはスキームを判定し、これを適切なURIサブクラスにマップし、そのクラスの新しいオブジェクトを組み立て、それを返します。

$scheme引数は$strが相対URIのときだけ使われます。それにはスキームを示す単純な文字列、絶対URIリファレンスが入った文字列、絶対URIオブジェクトが指定できます。相対URIに$schemeが指定されなければ、$strは単純に(何もスキーム独自のメソッドが使えない)汎用のURIとして扱われます。

URIリファレンスを組み立てるために使える文字のセットは制限されています(URI::Escapeをご覧ください)。このセットから外れる文字はURIコンストラクタにより自動的にエスケープされます。

$uri = URI->new_abs( $str, $base_uri )
これは新しい絶対のURIオブジェクトを組み立てます。$str引数は相対もしくは絶対のURIを示すことができます、そしてそれは$base_uriをベースとして使うことによって、絶対化されます。$base_uriは絶対URIでなければなりません。
$uri = URI::file->new( $filename, [$os] )
ファイル名から新しいfileURIを組み立てます。URI::file をご覧ください。
$uri = URI::file->new_abs( $filename, [$os] )
ファイル名から新しい絶対fileURIを組み立てます。URI::file をご覧ください。
$uri = URI::file->cwd
これは現在作業中のディレクトリをfileURIとして返します。URI::file をご覧ください。
$uri->clone
このメソッドは$uriのコピーを返します。

共通メソッド

このセクションで説明されるメソッドはすべてのURIオブジェクトで利用可能です。

URILの構成要素へのアクセスを提供するメソッドは常にその構成要素の古い値を返します。その構成要素がなければ返される値はundefになります。一般的に構成要素が空(""で表されます)であることと構成要素がない(undefで表されます)には違いがあります。もしアクセスするメソッドに引数が与えられれば、それは対応する構成要素を更新し、その構成要素の古い値を返します。未定義の引数を渡すと、(もし可能であれば)その構成要素を削除します。さまざまなアクセスするメソッドの説明がそのコンポーネントにエスケープされた文字列として渡すのかあるいは、エスケープされない文字列として渡すのかを示します。さらに細かい部分に分割できる構成要素は、通常エスケープされて渡されます。これはエスケープされていないとその意味が変わってしまうからです。

すべてのURIで利用可能な共通メソッドを以下に示します:

$uri->scheme( [$new_scheme] )
このメソッドは$uriのスキーム部分を設定し、返します。もし$uriが相対であれば、$uri->schemeはundefを返します。もし引数付きで呼ばれれば、$uriのスキームを更新し、おそらく$uriのクラスを変更します。そして古いスキームの値を返します。新しいスキーム名が不正であればcroakします:スキーム名は文字で始まり、US-ASCII、数字そしていくつかの特別な記号:"."、"+"、"-"だけで構成されなければなりません。この制限は実質的にスキームはエスケープなしに渡されるべきであることを意味しています。スキームに未定義の引数を渡すと(可能であれば)URIは相対になります。

文字の大文字/小文字はスキーム名では問題ありません。$uri->schemeで返される値は常に小文字です。もしURIに書いた元の大文字/小文字の状態が欲しいのであれば、代わりに$uri->_schemeメソッドを使うことができます。

$uri->opaque( [$new_opaque] )
このメソッドは$uriのスキーム独自部分(スキームからフラグメントまでのすべて)を、エスケープされた文字列として、設定し、返します。
$uri->path( [$new_path] )
URIが階層的な名前空間のための一般的な書式をサポートしていなければ、このメソッドは$uri->opaqueと同じ値を設定し、返します。その場合、ホスト名フラグメントの間にあるURIの一部を設定し、返すように汎用メソッドがオーバーライドされます。
$uri->fragment( [$new_frag] )
このメソッドはURIリファレンスのフラグメント識別子をエスケープされた文字列として返します。
$uri->as_string
このメソッドはURIオブジェクトをプレインな文字列にして返します。URIオブジェクトはオーバーロードによっても自動的にプレーンな文字列に変換されます。つまり$uriオブジェクトはほとんどのPerl構造においてプレーンな文字列として扱うことができるということです。
$uri->canonical
このメソッドはURIの正規化されたものを返します。正規化のルールはスキームによって違います。通常はスキームとインターネット・ホスト名要素の小文字化、デフォルト・ポートと同じになっている明確なポート指定の削除、すべてのエスケープ・シーケンスの大文字化、普通に表現することができるエスケープされていオクテットの通常化です。

効率の理由から、$uriがすでに正規化されている形式であれば、コピーの代わりにそれへのリファレンスが返されます。

$uri->eq( $other_uri )
 
URI::eq( $first_uri, $other_uri )
このメソッドは2つのURIリファレンスが同一であるかを調べます。同じ文字列に正規化されたURIリファレンスは同一であると考えます。メソッドは2つの文字列引数テストすることもできる単なる関数として使うことも出来ます。

2つのURIオブジェクト・リファレンスが同じオブジェクトを示しているかをテストする必要があれば、'=='演算子を使ってください。

$uri->abs( $base_uri )
このメソッドは絶対URIリファレンスを返します。もし$uriがすでに絶対であれば、それへのリファレンスが単に返されます。$uriが相対であれば、$uriと$base_uriをつなげることにより新しい絶対URIが組み立てられ、返されます。
$uri->rel( $base_uri )
このメソッドは同じリソースを表す$base_ruiへの相対を作ることが出来れば、相対URIリファレンスを返します。そうでなければ、$uriが単に返されます。

汎用メソッド

以下のメソッドは、階層的名前空間のための一般的/汎用の書式を使うスキームに使うことが出来ます。下記のスキームの説明はこれらのうちのどれかを示します。分からないスキームは一般的な書式をサポートしておらず、そのため以下のメソッドをサポートしていないものと考えられます。

$uri->authority( [$new_authority] )
このメソッドは$uriのエスケープされたauthority(認証)構成要素を設定し、返します。
$uri->path( [$new_path] )
このメソッドは$uriのエスケープされたpath構成要素(ホスト名とクエリ(=query)またはフラグメントの間の部分)を設定し、返します。pathは決して未定義になりませんが、空文字列にすることは出来ます。
$uri->path_query( [$new_path_query] )
このメソッドはエスケープされたpathとquery構成要素を1つのエンティティとして設定し、取得します。pathとqueryは"?"文字により分けられますが、queryそれ自身に"?"を入れることが出来ます。
$uri->path_segments( [$segment,...] )
このメソッドはpathを設定し、返します。スカラ・コンテキストでは$uri->pathと同じ値を返します。リスト・コンテキストではpathを構成するエスケープされないpathセグメントを返します。パラメータを持っているPathセグメントは無名配列として返されます。
最初の要素はエスケープされないpathセグメント・プロパーです。続く要素はエスケープされえたパラメータ文字列です。そのような無名配列は文字列としても扱うことが出来るようオーバーローディングを使いますが、この文字列にはパラメータは含まれません。
$uri->query( [$new_query] )
このメソッドは$uriのエスケープさえれたquery構成要素を設定し、返します。
$uri->query_form( [$key => $value,...] )
このメソッドはapplication/x-www-form-urlencoded 形式を使ったquery構成要素を設定し、返します。キー/値の組は"&"で分けられ、そのキーは値から"="文字で分けられます。
$uri->query_keywords( [$keywords,...] )
このメソッドは"+"により分けられるキーワードのフォーマットを使っているquery構成要素を設定し、返します。

サーバメソッド

authority 構成要素がインターネット・ホストを示すスキームは汎用メソッドに加えて以下のメソッドを利用することが出来ます。

$uri->userinfo( [$new_userinfo] )
このメソッドはエスケープされたauthority構成要素のuserinfo部分を設定し、返します。

いくつかのスキームにとっては、コロンで区切られたこれはユーザ名とパスワードになります。この実装は推奨されません。(URIのように)クリアなテキストに埋め込むことは、使うすべての場合においてセキュリティのリスクとなることが証明されています。

$uri->host( [$new_host] )
このメソッドはエスケープされないホスト名を設定し、返します。

$new_host文字列がコロンと数字で終わっていれば、この番号はポートを設定します。

$uri->port( [ $new_port] )
このメソッドはポートを設定し、返します。ポートは0より大きくなければならない単純な整数です。

URIで明確にポートが指定されなければ、URIスキームのデフォルトのポートが返されます。デフォルトのポートへの置換をして欲しくないのであれば、$uri->_portメソッドを代りに使うことが出来ます。

$uri->host_port( [ $new_host_port ] )
このメソッドはホストとポートを1つの単位として設定し、返します。デフォルトのポートにマッチしていても、返される値にはポートも含まれます。ホスト部分とポート部分はコロン":"で区切られます。
$uri->default_port
このメソッドは$uriが所属するURIスキームのデフォルト・ポートを返します。 http は番号80になります。ftp では番号21になりますなど。スキームのためのデフォルト・ポートは変更できません。

スキーム特有サポート

以下のURIスキームは特別にサポートされています。これらのうちの1つに所属していないURIオブジェクトでは、共通と汎用メソッドしか使えません。

data:
data URI スキームはRFC2397で定義されています。これはまるで外部に含まれているかのように、小さなデータ要素を"immediate"データとして含むことを許しています。

dataスキームに所属するURI オブジェクトは共通メソッドと、スキーム特有の構成要素にアクセスするための2つの新しいメソッド; $uri->media_typeと$uri->data をサポートします。詳細はURI::data をご覧下さい。

file:
file URIスキームの古い仕様はRFC1738にあります。新しいRFC2396をベースとした仕様はまだ利用できませんが、file URIリファレンスは共通に使えます。

fileスキームに所属するURI オブジェクトは共通と汎用のメソッドをサポートします。さらにfile URIとローカル・ファイル名をマッピングする2つのメソッド; $uri->file、$uri->dir を提供します。詳細はURI::fileをご覧下さい。

ftp:
ftp URIスキームの古い仕様はRFC1738にあります。新しいRFC2396をベースとした仕様はまだ利用できませんが、ftp URIリファレンスは共通に使えます。

ftpスキームに所属するURI オブジェクトは共通、汎用、サーバーのメソッドをサポートします。さらにuserinfoにアクセスするための2つのメソッド; $uri->user、$uri->passwordを提供します。

gopher:
gopher URI スキームは<draft-murali-url-gopher-1996-12-04> で定義され、RFC2396ベース仕様として利用できる見込みです。

gopherスキームに所属するURIオブジェクトは共通、汎用、そしてサーバメソッドをサポートします。さらにgopher特有のpath構成要素にアクセスするためのメソッドをサポートします: $uri->gopher_type, $uri->selector, $uri->search, $uri->string.

http:
http URI スキームは<draft-ietf-http-v11-spec-rev-06> (すぐにRFCになるでしょう)で定義されています。このスキームはHTTPサーバによりホストされる参照リソースとして使われます。

httpスキームに所属するURI オブジェクトは共通、汎用そしてサーバメソッドをサポートします。

https:
httpsURIスキームはNetscapeが提案し、一般的に実装されています。このスキームはSSL接続を通したHTTPサーバリファレンスのために使われます。その書式はhttpと同じですが、デフォルト・ポートは違います。
ldap:
ldap URI スキームはRFC2255で定義されます。LDAP は軽量ディレクトリ・アクセス・プロトコル(Lightweight Directory Access Protocol)です。 ldap URI はLDAPディレクトリから情報を取り出すために実行するLDAP検索操作を記述します。

ldapスキームに所属するURI オブジェクトは共通、汎用、サーバメソッドとldapメソッドをサポートします: $uri->dn, $uri->attributes, $uri->scope, $uri->filter, $uri->extensions。詳細はURI::ldap をご覧下さい。

mailto:
mailto URI スキームはRFC2368で定義されています。スキームは元はインターネット・メーリング・アドレスを示すために使われました。それは(RFC 2368で)他のメールヘッダ・フィールドとメッセージ・ボディの設定を許すように拡張されています。

mailtoスキームに所属するURI オブジェクトは共通メソッドと汎用の問い合わせメソッドをサポートします。さらに以下のmailto独自のメソッドもサポートします: $uri->to, $uri->headers.。

news:
news, nntp そしてsnews URI スキームは<draft-gilman-news-url-01> で定義され、RFC2396ベース仕様として使える見込みです。

newsスキームに所属するURI オブジェクトは共通、汎用そしてサーバメソッドをサポートします。さらにpathにアクセスするための幾つかのメソッドも提供します: $uri->group と $uri->message.

nntp:
news スキームをご覧下さい。
pop:
pop URI スキームはRFC2384で定義されます。スキームはPOP3メールボックスの参照に使われます。

popスキームに所属するURI オブジェクトは共通、汎用、そしてサーバメソッドをサポートします。さらにuserinfo構成要素に空く瀬するための2つのメソッドを提供します: $uri->user と $uri->auth

rlogin:
rloginURIスキームの古い仕様はRFC1738にあります。rloginスキームに所属するURIオブジェクトは共通、汎用、サーバメソッドをサポートします。
snews:
news スキームをご覧下さい。その書式はnewsと同じですが、デフォルト・ポートは違います。
telnet:
telnetURIスキームの古い仕様はRFC1738にあります。telnetスキームに所属するURIオブジェクトは共通、汎用そしてサーバメソッドをサポートします。

構成設定変数

以下の構成設定変数がクラストそのメソッドがどのように動くかに影響を与えます:

$URI::ABS_ALLOW_RELATIVE_SCHEME
いくつかの古いパーサは、ベースURLスキームと同じであれば、スキーム名が相対でも存在することを許すことがあります。RFC2396はこれはやめるべきだと言っていますが、$URI::ABS_ALLOW_RELATIVE_SCHEME変数をTRUEに設定することによりこの古い動きを可能にすることができます。以下の例で違いを示します:
  URI->new("http:foo";)->abs("http://host/a/b";)
      ==>  "http:foo";
  local $URI::ABS_ALLOW_RELATIVE_SCHEME = 1;
  URI->new("http:foo";)->abs("http://host/a/b";)
      ==>  "http:/host/a/foo";
$URI::ABS_REMOTE_LEADING_DOTS
$URI::ABS_REMOTE_LEADING_DOTSをTRUEに設定することにより、abs()メソッドに相対URIでの過剰な".."セグメントを無視させることもできます。以下の例で違いを示します:
  URI->new("../../../foo")->abs("http://host/a/b";)
      ==> "http://host/../../foo";
  local $URI::URL::ABS_REMOTE_LEADING_DOTS = 1;
  URI->new("../../../foo")->abs("http://host/a/b";)
      ==> "http://host/foo";

参考資料

URI::file, URI::WithBase, URI::Escape, URI::Heuristic

RFC 2396: ``Uniform Resource Identifiers (URI): Generic Syntax'', Berners-Lee, Fielding, Masinter, August 1998.


著作権(COPYRIGHT)

(原文のまま)

Copyright 1995-1999 Gisle Aas.

Copyright 1995 Martijn Koster.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


作者/謝辞

(原文のまま)

This module is based on the URI::URL module, which in turn was (distantly) based on the wwwurl.pl code in the libwww-perl for perl4 developed by Roy Fielding, as part of the Arcadia project at the University of California, Irvine, with contributions from Brooks Cutter.

URI::URL was developed by Gisle Aas, Tim Bunce, Roy Fielding and Martijn Koster with input from other people on the libwww-perl mailing list.

URI and related subclasses was developed by Gisle Aas.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。