名前

Mojo::Content - HTTPコンテンツの基底クラス

使い方

package Mojo::Content::MyContent;
use Mojo::Base 'Mojo::Content';

sub body_contains  {...}
sub body_size      {...}
sub get_body_chunk {...}

説明

Mojo::Content::MultiPartMojo::Content::Singleのような、 HTTPコンテンツのための抽象基底クラスです。 RFC 7230RFC 7231を元にしています。

イベント

Mojo::ContentMojo::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::ContentMojo::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を反映)

関連情報