Jifty::Plugin::Compat - Provide Jifty API compatibility


Jifty documentation Contained in the Jifty distribution.

Index


Code Index:

NAME

Top

Jifty::Plugin::Compat - Provide Jifty API compatibility

SYNOPSIS

Top

# In your jifty config.yml under the framework section:

  Plugins:
    - Compat: {}

DESCRIPTION

Top

This plugin provides Jifty API compatibility.

ConfigVersion VERSION 5

Provides Jifty::Handler->apache for apps prior to ConfigFileVersion 5.

TODO: this should also rebind STDIN/STDOUT in the per-request hook.

METHODS

Top

wrap APP

Wraps the provided Plack app in the compatibility layer. You'll never need to call this yourself.


Jifty documentation Contained in the Jifty distribution.

use strict;
use warnings;

package Jifty::Plugin::Compat;
use base 'Jifty::Plugin';
use CGI::Emulate::PSGI ();

*Jifty::Handler::apache = sub {
    return 'Jifty::Plugin::Compat::Apache';
};

*Jifty::Handler::cgi = sub {
    return 'Jifty::Plugin::Compat::CGI';
};

require Jifty::View::Mason::Handler;
my $old_new = Jifty::View::Mason::Handler->can('new');
no warnings 'redefine';
*Jifty::View::Mason::Handler::new = sub {
    my $self = $old_new->(@_);

    $self->interp->compiler->add_allowed_globals('$r');
    $self->interp->set_global('$r', 'Jifty::Plugin::Compat::Apache');

    return $self;
};

sub wrap {
    my ($self, $app) = @_;

    sub {
        my $env = shift;
        my %cgi = CGI::Emulate::PSGI->emulate_environment($env);
        local *STDIN  = $env->{'psgi.input'};
        local *STDERR = $env->{'psgi.errors'};
        local %ENV = (%ENV, %cgi);
        $app->($env);
    }
}

push @Jifty::TestServer::ISA, 'Jifty::Server';

package Jifty::Server;

package Jifty::Plugin::Compat::CGI;
use Carp;

sub param {
    my ($class, $key, $val) = @_;
    my $params = Jifty->web->request->parameters;
    if (defined $val) {
        $params->{$key} = $val;
    }
    else {
        return $params->{$key};
    }
}

sub Vars {
    my $params = Jifty->web->request->parameters;
}

sub AUTOLOAD {
    our $AUTOLOAD;
    croak "compat cgi does not handle $AUTOLOAD";
}


package Jifty::Plugin::Compat::Apache;
use Carp;

sub header_in {
    my $class = shift;
    return Jifty->web->request->header(@_);
}

sub headers_in {
    return Jifty->web->request->headers;
}

sub header_out {
    my ($class, $key, $val) = @_;
    if ($key eq 'Status') {
        Jifty->web->response->status( $val );
        return;
    }

    if ($key eq 'Content-Type') {
        Jifty->web->response->content_type( $val );
        return;
    }

    if ($key eq 'Location') {
        Jifty->web->response->status( 302 );
    }

    Jifty->web->response->header( $key, $val );
}

sub headers_out {
    return Jifty->web->response->headers;
}

sub uri {
    my $req = Jifty->web->request;
    return $req->script_name . $req->path_info || '';
}

sub method {
    Jifty->web->request->method;
}

sub content_type {
    my $class = shift;
    Jifty->web->response->content_type( @_ );
}

sub AUTOLOAD {
    our $AUTOLOAD;
    croak "compat apache does not handle $AUTOLOAD";
}

sub params {
    my $class = shift;
    return %{ Jifty->web->request->parameters };
}

1;