LlHTTPRequest/ja
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
フラグ | 値の型 | 初期値 | 説明 | |
---|---|---|---|---|
HTTP_METHOD | 0 | string | "GET" | 'GET', 'POST', 'PUT' と 'DELETE' |
HTTP_MIMETYPE | 1 | string | "text/plain;charset=utf-8" | text/* MIME タイプでは charset を指定しなければなりません。HTML フォームをエミュレートできるようにするために、 application/x-www-form-urlencoded を使用しましょう。これによって、適切にエスケープ (llEscapeURL) されたフォーム var=value&var2=value2 の中の <name,value> ペアのシーケンス文字列に body を設定して、 Web フレームワークで自動的に解析できるようにすることができます。 |
HTTP_BODY_MAXLENGTH | 2 | integer | 2048 | UTF-8でエンコードされたHTTPボディの最大バイト長を設定します。最大値はVMに依存します。 |
HTTP_VERIFY_CERT | 3 | integer boolean | TRUE | TRUE の場合、サーバ SSL 認証は、HTTPS リクエストを作成する時点で標準的な認証機関のどれかを用いて認証できる状態になっていなければなりません。 FALSE の場合は、すべてのサーバ SSL 認証は無条件に受け入れられます。 |
HTTP_VERBOSE_THROTTLE | 4 | integer | TRUE | TRUEならサーバーに送られてくるリクエストの速度が制限値を超えた場合、 DEBUG_CHANNELでメッセージが叫ばれます。FALSEならエラーメッセージを出しません。(llHTTPRequestは黙ってNULL_KEYを返します). |
ヘッダ | 説明 | データ例 |
---|---|---|
X-SecondLife-Shard | オブジェクトの存在する環境。 "Production" はメイングリッド、 "Testing" はプレビューグリッドです。 | Production |
X-SecondLife-Object-Name | スクリプトが入っているオブジェクトの名前 | Object |
X-SecondLife-Object-Key | スクリプトが入っているオブジェクトのキー | 01234567-89ab-cdef-0123-456789abcdef |
X-SecondLife-Region | オブジェクトが存在する地域名。地域南西端のグローバル座標も表示されます。 | Jin Ho (264448, 233984) |
X-SecondLife-Local-Position | 地域内でのオブジェクトの位置 | (173.009827, 75.551231, 60.950001) |
X-SecondLife-Local-Rotation | スクリプトが入っているオブジェクトの回転 | 0.000000, 0.000000, 0.000000, 1.000000 |
X-SecondLife-Local-Velocity | オブジェクトの速度 | 0.000000, 0.000000, 0.000000 |
X-SecondLife-Owner-Name | オブジェクトのオーナーの名前 | Zeb Wyler |
X-SecondLife-Owner-Key | オブジェクトのオーナーの UUID | 01234567-89ab-cdef-0123-456789abcdef |
CGI 環境では名前全体を大文字にした変数でヘッダーを設置し、ダッシュをアンダースコアに置き換え、 "HTTP_" を名前の前につけます。例えば "X-SecondLife-Object-Name" は "HTTP_X_SECONDLIFE_OBJECT_NAME" となります。 |
警告
- url内にスペースがある場合、http_response のステータスコードは 499 になるでしょう。
- レスポンスの BODY は 2048 バイトが上限です。長い場合は切り捨てられるでしょう。
- リクエストは オブジェクト 単位で抑制されます。(プリム単位ではありません)
- インターネットからテクスチャあるいは画像を呼び出すことには使えません。詳細は Web Textures をみましょう。.
- アクセスしたサイトが L$ トランザクションをレポートする LSL スクリプトに依存する場合、スクリプトはベータグリッド上で走っているかどうかを確認するために、X-SecondLife-Shard ヘッダを確認すべきです。
- テキストか HTML ファイルのような承認できないメタデータファイルの POST の場合、 405 エラーを返すサーバもあります。いずれの環境でも確実に成功する GET メソッドを使うようにしましょう。
- サーバから送信された HTTP ステータスコードがスクリプトに渡されても、302 のようなリダイレクトコードの場合、自動的にこっそりとリダイレクト先を追跡してリダイレクトして、その結果が返ります。
- HTTP-in を使ったスクリプトに向けてリクエストを作成するとき、次のことがらがあてはまります。
- Cap URL にクエリ文字列を追加するときは、Cap の GUID とクエリ文字列の '?' トークンの間にスラッシュを入れなければなりません。例えば、 https://sim123.agni.lindenlab.com/cap/f23b4b94-012d-44f2-bd0c-16c328321221?arg=gra は HTTP 500 エラーを返しますが、 https://sim123.agni.lindenlab.com/cap/f23b4b94-012d-44f2-bd0c-16c328321221/?arg=gra は成功します。
サンプル
key http_request_id;
default
{
state_entry()
{
http_request_id = llHTTPRequest("url", [], "");
}
http_response(key request_id, integer status, list metadata, string body)
{
if (request_id == http_request_id)
{
llSetText(body, <0,0,1>, 1);
}
}
}
PHPテストスクリプト例
<?php header("content-type: text/plain; charset=utf-8"); ?>
受信したヘッダ:
<?php
/**
* @author Wouter Hobble
* @copyright 2008
*/
foreach ($_SERVER as $k => $v)
{
if( substr($k, 0, 5) == 'HTTP_')
{
print "\n". $k. "\t". $v;
}
}
?>
Apacheヘッダとグローバルメソッドの両方をキャプチャするラッパースクリプト例
<?PHP
// Author Waster Skronski.
// General Public License (GPL).
// Mind that some headers are not included because they're either useless or unreliable.
$USE_APACHE_HEADERS = TRUE; // switch to false if you need cgi methods
if ($USE_APACHE_HEADERS)
{
$headers = apache_request_headers();
$objectgrid = $headers["X-SecondLife-Shard"];
$objectname = $headers["X-SecondLife-Object-Name"];
$objectkey = $headers["X-SecondLife-Object-Key"];
$objectpos = $headers["X-SecondLife-Local-Position"];
$ownerkey = $headers["X-SecondLife-Owner-Key"];
$ownername = $headers["X-SecondLife-Owner-Name"];
$regiondata = $headers["X-SecondLife-Region"];
$regiontmp = explode ("(",$regiondata); // cut cords off
$regionpos = explode (")",$regiontmp[1]); //
$regionname = substr($regiontmp[0],0,-1); // cut last space from simname
} else {
$db = $GLOBALS;
$headers = $db['HTTP_ENV_VARS'];
$objectgrid = $headers["HTTP_X_SECONDLIFE_SHARD"];
$objectname = $headers["HTTP_X_SECONDLIFE_OBJECT_NAME"];
$objectkey = $headers["HTTP_X_SECONDLIFE_OBJECT_KEY"];
$ownerkey = $headers["HTTP_X_SECONDLIFE_OWNER_KEY"];
$objectpos = $headers["HTTP_X_SECONDLIFE_LOCAL_POSITION"];
$ownername = $headers["HTTP_X_SECONDLIFE_OWNER_NAME"];
$regiondata = $headers["HTTP_X_SECONDLIFE_REGION"];
$regiontmp = explode ("(",$regiondata);
$regionpos = explode (")",$regiontmp[1]);
$regionname = substr($regiontmp[0],0,-1);
}
?>
注意点
llHTTPRequest/http_response を使っているときに、なんらかの理由により正当な RSS フィードや他の Web コンテンツが解析できなくなった場合は、Second Life の外で作業する必要が出てくるでしょう。これは近い将来変更されることはないと思われます。ヘッダをチェックするのに、シミュレータレベルでさらにオーバーヘッドが加算されるからです。
llHTTPRequest を使っている時に、PC の Web ブラウザで期待した結果を返す URL と同じ URL にアクセスしても、Web ブラウザによっては、 NULL や意味のない結果を返すことがあるのに気づくでしょう。これは llHTTPRequest の User Agent 文字列が、 "Mozilla" を含んでいないため、 Web サーバによっては認知されないからだと思われます。"Mozilla" は、例えば、Shoutcast や RSS クライアントではなく、Web ブラウザであることを識別します。回避策としては、" HTTP/1.0\nUser-Agent: LSL Script (Mozilla Compatible)\n\n" や似たようなものを URL 文字列に追加します。それはその場しのぎで HTTP リクエストを Web ブラウザから送信されたかのように見せかけることになります。
CGI環境は名前全体を大文字にした変数でヘッダーを設置し、ダッシュをアンダースコアに置き換え、"HTTP_" を名前の前につけます。例えば "HTTP_X_SECONDLIFE_OBJECT_NAME" のようになります。PHP の $_SERVER 変数も同じようにします。
Apache は、CustomLog や LogFormat ディレクティブを使って、ログにヘッダを含めることができます。構文上の詳細については ドキュメント を参照しましょう。