Mojo::Content - HTTPコンテンツの基底クラス
使い方
package Mojo::Content::MyContent; use Mojo::Base 'Mojo::Content'; sub body_contains {...} sub body_size {...} sub get_body_chunk {...}
説明
Mojo::Content::MultiPart、Mojo::Content::Singleのような、 HTTPコンテンツのための抽象基底クラスです。 RFC 7230と RFC 7231を元にしています。
イベント
Mojo::ContentはMojo::EventEmitterからすべてのイベントを継承していて、 Mojo::Contentは新たにイベントを発生させます。
body
$content->on(body => sub { my $content = shift; ... });
すべてのヘッダーが解析され、ボディが始まったときに一度だけ発行されます。
$content->on(body => sub { my $content = shift; $content->auto_upgrade(0) if $content->headers->header('X-No-MultiPart'); });
drain
$content->on(drain => sub { my ($content, $offset) = @_; ... });
すべてのデータが書き込まれたときに一度だけ発行される。
$content->on(drain => sub { my $content = shift; $content->write_chunk(time); });
read
$content->on(read => sub { my ($content, $bytes) = @_; say "Streaming: $bytes"; });
新しいコンテンツのチャンクが到着したときに発行されます。
$content->unsubscribe('read'); $content->on(read => sub { my ($content, $chunk) = @_; say "Streaming: $chunk"; });
属性
Mojo::Contentは次の属性を実装しています。
auto_decompress
my $bool = $content->auto_decompress; $content = $content->auto_decompress($bool);
is_compressed
が真ならば、自動的にコンテンツをデコンプレスします。
auto_relax
my $bool = $content->auto_relax; $content = $content->auto_relax($bool);
壊れたWebサーバーを検知し、自動的に緩やかな解析を有効にします。
headers
my $headers = $content->headers; $content = $content->headers(Mojo::Headers->new);
ヘッダー。デフォルトはMojo::Headersオブジェクト。
max_buffer_size
my $size = $content->max_buffer_size; $content = $content->max_buffer_size(1024);
コンテントパーサーのためのバッファの最大バイトサイズ。 デフォルトの値ははMOJO_MAX_BUFFER_SIZE
環境変数の値、あるいは262144
(256KB).
max_leftover_size
my $size = $content->max_leftover_size; $content = $content->max_leftover_size(1024);
パイプライン化されたHPPリクエストのためのバッファの最大バイトサイズ。デフォルトはMOJO_MAX_LEFTOVER_SIZE
の値か、 262144
(256KB)です。
relaxed
my $bool = $content->relaxed; $content = $content->relaxed($bool);
接続を閉じることを停止する レスポンスのために 緩やかな解析を有効にします。
skip_body
my $bool = $content->skip_body; $content = $content->skip_body($bool);
ヘッダの解析の後に、ボディの解析をスキップして終了します。
メソッド
Mojo::ContentはMojo::Baseからすべてのメソッドを継承しており、 次の新しいメソッドを実装しています。
body_contains
my $bool = $content->body_contains('foo bar baz');
コンテンツが指定した文字列を含んでいるかチェックします。 サブクラスでオーバーロードすることが想定されています。
body_size
my $size = $content->body_size;
バイトでのコンテンツのサイズ。 サブクラスでオーバーロードすることが想定されています。
boundary
my $boundary = $content->boundary;
コンテントタイプヘッダからマルチパート境界を抽出します。
charset
my $charset = $content->charset;
コンテントタイプ(Content-Type
)ヘッダからキャラクターセットを抽出します。
clone
my $clone = $content->clone;
可能であればコンテンツを複製し新しいMojo::Contentオブジェクトを返します。そうでなければ未定義値を返却します。
generate_body_chunk
my $chunk = $content->generate_body_chunk(0);
動的なコンテンツを生成します。
get_body_chunk
my $chunk = $content->get_body_chunk(0);
特定の位置から始まるコンテンツの断片を取得します。サブクラスでオーバーロードされます。
get_header_chunk
my $chunk = $content->get_header_chunk(13);
特定の位置から始まるヘッダーの断片を取得します。このメソッドは、コンテントをファイナライズすることに注意してください。
header_size
my $bool = $content->is_chunked;
バイトでのヘッダーサイズ。このメソッドは、コンテントをファイナライズすることに注意してください。
is_chunked
my $bool = $content->is_chunked;
"Transfer-Encoding"ヘッダが、断片化された転送エンコーディングを意味しているか確認します。
is_compressed
my $bool = $content->is_compressed;
コンテンツがgzipで圧縮のための"Content-Encoding"ヘッダがあるかを確認します。
is_dynamic
my $bool = $content->is_dynamic;
コンテンツが動的なものになるかどうかをチェックします。 これはclone
が働くのを抑止します。
is_finished
my $bool = $content->is_finished;
パーサーが終了しているかどうかをチェックします。
is_limit_exceeded
my $bool = $content->is_limit_exceeded;
バッファーがmax_buffer_size
を超えていないかどうかをチェックします。
is_multipart
my $multipart = $content->is_multipart;
常に偽になります。これはMojo::Content::MultiPartオブジェクトではありません。
is_parsing_body
my $bool = $content->is_parsing_body;
ボディの解析が開始しているかどうかをチェックします。
leftovers
my $bytes = $content->leftovers;
次のHTTPメッセージのためのレフトオーバー。
parse
$content = $content->parse("Content-Length: 12\x0d\x0a\x0d\x0aHello World!");
コンテンツを解析します。
parse_body
$content = $content->parse_body("Hi!");
ボディを解析し、ヘッダをスキップします。
progress
my $bytes = $content->progress;
すでにメッセージのコンテンツから受け取ったバイト数。
write
$content = $content->write; $content = $content->write(''); $content = $content->write($bytes); $content = $content->write($bytes => sub {...});
動的なコンテンツをノンブロッキングで書き込みます。 オプションの排水のコールバックは すべてのデータが書き込まれると一度だけ呼び出されます。
このメソッドをデータのチャンクなしで呼び出すと、 headers
をファイナライズし、 動的コンテンツが、後で書かれることを許可します。 ストリームの最後にいつでも、空のチャンクデータを書き込むことができます。
# 前のチャンクデータが継続する前に書かれることを保証する $content->write('He' => sub { my $content = shift; $content->write('llo!' => sub { my $content = shift; $content->write(''); }); });
write_chunk
$content = $content->write_chunk; $content = $content->write_chunk(''); $content->write_chunk('Hello!'); $content->write_chunk('Hello!', sub {...});
コンテンツをノンブロッキングで、チャンクトランスファーエンコーディングを使って、書き込みます。 オプションの排水のコールバックは すべてのデータが書き込まれると一度だけ呼び出されます。
このメソッドをデータのチャンクなしで呼び出すと、 headers
をファイナライズし、 動的コンテンツが、後で書かれることを許可します。 ストリームの最後にいつでも、空のチャンクデータを書き込むことができます。
# 前のチャンクデータが継続する前に書かれることを保証する $content->write_chunk('He' => sub { my $content = shift; $content->write_chunk('llo!' => sub { my $content = shift; $content->write_chunk(''); }); });
参考
Mojolicious, Mojolicious::Guides, http://mojolicio.us.
(Mojolicious 8.12を反映)