�轵�����餳�ä����ɤ��򤤤��ä�ͷ��Ǥ��Τ����ɡ�HTTP::Engine�ˤ�HTTP::Engine::Middleware�Ȥ����ߥɥ륦����������Ȥߤ⤢��Τǡ����ä����ʤΤ�UdonMap(Rack::URLMap��ɤ�)��ߥɥ륦�����Ǽ������Ƥߤ���

gist: 117012 - GitHub

����ε����ΤȤ��ȹ������Ѥ�äƤ뤱�ɵ��ˤ��ʤ������ǡ����Ȥ����ε���ľ���Ȥ������ε�������­������Udon::Middleware::URLMap���ߥɥ륦�����ǡ�server-middleware.pl���ߥɥ륦������UdonMap��Ȥäƽ�ľ������Ρ�

�ߥɥ륦�������Τϴ�ñ�˺�줿��use HTTP::Engine::Middleware�����Moose�ν���������򤷤���ߥɥ륦�����ѤΥ᥽�åɤ����䤷���ꤷ�Ƥ����Τǡ�HTTP::Engine��new����Ȥ��˻��ꤷ���ϥ�ɥ������˼¹Ԥ���������ꤿ���Ȥ��ϡ�before_handle��HTTP::Engine::Request������Ȥä�HTTP::Engine::Response���֤�������񤤤Ƥ��Ф��������� ���Υߥɥ륦�������������٤�Request����ʤ��Ȥ��䡢Request��ù����Ƽ����Ϥ������Ȥ��ϡ�Response����ʤ���Request���֤��Ƥ��ȼ��Υߥɥ륦������ϥ�ɥ�˽������Ϥ��ͻҡ���ñ��ñ�����ȥ⥸�塼��κǸ��__MIDDLEWARE__��񤯤Τ�˺�줺�ˡ�����Ǹ�����⤷�Ƥ���롣

���礤��­����̩�˸����ȡ�before_handle���֤��ͤ�HTTP::Engine::Response���ä��Ȥ��˸¤ꡢ������before_handle�Υ롼�פ���λ���롣�ʤΤǼ��Υߥɥ륦�����˽�����󤷤����Ȥ��ϡ��̤�HTTP::Engine::Request���֤��ʤ��㤤���ʤ��櫓�ǤϤʤ������������Υߥɥ륦�������֤����ͤ����Τޤ޼��Υߥɥ륦�����⤷����request_handler�˥ꥯ�����ȤȤ����Ϥ�Τǡ����̤�HTTP::Engine::Request�������Ʊ�������񤤤򤹤륪�֥������Ȥ��֤���Τ��Ȼפ����������ʤ��ȥߥɥ륦������Ťͤ��ʤ�����

�ǡ����θ�request_handler��after_handle�ν����ؤ�³��������ɡ��⤷before_handle������Τ����Τɤ줫��HTTP::Engine::Response���֤��Ƥ�����request_handler�ϸƤФ�ʤ����Ǥ�after_handle�ϥ��顼�Ǥ�ФƤʤ��¤�ϸƤФ�뤷����ǻߤޤ뤳�Ȥ�ʤ����Ĥޤ�after_handle����äƤ�ߥɥ륦�����������¹Ԥ�������Ȥ�����ư�ΤϤ���

�Ȥ����Ǽ¤Ϥ��켫�ΤϤ����äȺ�줿������ɡ��������褦�Ȼפäƥե�����ξ��ܤ��ƥ⥸�塼���̾���Ѥ����餤���ʤ�ư���ʤ��ʤäƤ���äȤ����ϥޤä����ǽ�˽񤤤Ƥ��Ȥ���NetaKit::Middleware::URLMap�ä�̾���ˤ��Ƥ�������ɡ�UdonMap2�ä�̾���ˤ���Ȳ��Τ���before_handle����__MIDDLEWARE__���Ρ�����ʤ��͡��衢���ۤ��פ�Perl������ܤ��롣�ʤ󤸤�����Ȼפ��Ĥĥ������ɤ�Ǥ�Ȥ��ˤ�����ͳ�˵��դ�����HTTP::Engine::Middleware��use���Ƥ��ĤΥ⥸�塼��̾�����Middleware�äƤΤ��ޤޤ�Ƥʤ��ȡ����Υ⥸�塼���ߥɥ륦�����Ȥ��ƽ�������Ƥ���ʤ���

# HTTP/Engine/Middleware.pm����ȴ��
sub import {
    my($class, ) = @_;
    my $caller = caller;

    return unless $caller =~ /(?:\:)?Middleware\:\:.+/;

    strict->import;
    warnings->import;

    init_class($caller);

    if (Any::Moose::moose_is_preferred()) {
        Moose->import({ into_level => 1 });
    } else {
        Mouse->export_to_level( 1 );
    }

    no strict 'refs';
    *{"$caller\::__MIDDLEWARE__"} = sub {
        use strict;
        my $caller = caller(0);
        __MIDDLEWARE__($caller);
    };

    *{"$caller\::before_handle"}     = sub (&) { goto \&before_handle     };
    *{"$caller\::after_handle"}      = sub (&) { goto \&after_handle      };
    *{"$caller\::middleware_method"} = sub     { goto \&middleware_method };
}

�ʤ�Ǥ��ʡ��Ȥ���äȹͤ���������ɡ��ߥɥ륦�������Ȥ���Ȥ��Ȥ���use HTTP::Engine::Middleware�ʤ�����ɡ�import����Ǥ������������������Ƥ�Τǡ����⤷�ʤ���лȤ�¦�ΤȤ��Ǥ�Moose�ν����������before_handle�����䤷���ꤷ�Ƥ��ޤ���������¿ʬ�⥸�塼��̾��������դ��Ƥ����Ф褷�ʤˤ�äƤ����褦�ˤ��Ƥ����������Ȥ��פäƤ���������������äƤ�����󡣵��դ��貶�ġ�

�Ȥ����櫓��HTTP::Engine��HTTP::Engine::Middleware�λȤ������ʤ�Ȥʤ�ʬ���äƤ����Τǡ������������ɤ󲰤ȵ����ΤϽ����ˤ��ơ����̤�WAF�äݤ�ư���򤹤��ΤǤ��äƤߤ褦���ʡ�