NAME

App::MREST::Resource - HTTP request/response cycle

SYNOPSIS

In YourApp/Resource.pm:

use parent 'Web::MREST::Resource';

In PSGI file:

use Web::Machine;

Web::Machine->new(
    resource => 'App::YourApp::Resource',
)->to_app;

It is important to understand that the Web::Machine object created is actually blessed into YourApp::Resource. The line of inheritance is:

YourApp::Resource 
    -> Web::MREST::Resource 
        -> Web::Machine::Resource
            -> Plack::Component

DESCRIPTION

Your application should not call any of the routines in this module directly. They are called by Web::Machine during the course of request processing. What your application can do is provide its own versions of selected routines.

METHODS

Context methods

Methods for manipulating the context, a hash where we accumulate information about the request.

context

Constructor/accessor

push_onto_context

Takes a hashref and "pushes" it onto $self->{'context'} for use later on in the course of processing the request.

Status declaration methods

Although Web::Machine takes care of setting the HTTP response status code, but when we have to override Web::Machine's value we have this "MREST declared status" mechanism, which places a declared_status property in the context. During finalization, the HTTP status code placed in this property overrides the one Web::Machine came up with.

mrest_declare_status

This method takes either a ready-made App::CELL::Status object or, alternatively, a PARAMHASH. In the former case, an HTTP status code can be "forced" on the response by including a http_code property in the object. In the latter case, the following keys are recognized (and all of them are optional):

level

App::CELL::Status level, can be any of the strings accepted by that module. Defaults to 'ERR'.

code

The HTTP status code to be applied to the response. Include this only if you need to override the code set by Web::Machine.

explanation

Text explaining the status - use this to comply with RFC2616. Defaults to '<NONE>'.

permanent

Boolean value for error statuses, specifies whether or not the error is permanent - use this to comply with RFC2616. Defaults to true.

mrest_declared_status_code

Accessor method, gets just the HTTP status code (might be undef); and allows setting the HTTP status code, as well, by providing an argument.

mrest_declared_status_explanation

Accessor method, gets just the explanation (might be undef). Does not allow changing the explanation - for this, nullify the declared status and declare a new one.

status_declared

Boolean method - checks context for presence of 'declared_status' property. If it is present, the value of that property is returned, just as if we had done $self->context->{'declared_status'}. Otherwise, undef (false) is returned.

declared_status

Synonym for status_declared

nullify_declared_status

This method nullifies any declared status that might be pending.

FSM Part One

The following methods override methods defined by Web::Machine::Resource. They correspond to what the Web::MREST calls "Part One" of the FSM. To muffle debug-level log messages from this part of the FSM, set $muffle{1} = 1 (above).

service_available (B13)

This is the first method called on every incoming request.

mrest_service_available

Hook. If you overlay this and intend to return false, you should call $self->mrest_declare_status !!

known_methods (B12)

Returns the value of MREST_SUPPORTED_HTTP_METHODS site parameter

uri_too_long (B11)

Is the URI too long?

allowed_methods (B10)

Determines which HTTP methods we recognize for this resource. We return these methods in an array. If the requested method is not included in the array, Web::Machine will return the appropriate HTTP error code.

RFC2616 on 405: "The response MUST include an Allow header containing a list of valid methods for the requested resource." -> this is handled by Web::Machine, but be aware that if the methods arrayref returned by allowed_methods does not include the current request method, allow_methods gets called again.

malformed_request (B9)

A true return value from this method aborts the FSM and triggers a "400 Bad Request" response status.

mrest_malformed_request

Hook

is_authorized (B8)

Authentication method - should be implemented in the application.

forbidden (B7)

Authorization method - should be implemented in the application.

valid_content_headers (B6)

Receives a Hash::MultiValue object containing all the Content-* headers in the request. Checks these against << $site->MREST_VALID_CONTENT_HEADERS >>, returns false if the check fails, true if it passes.

known_content_type (B5)

The assumption for PUT and POST requests is that they might have an accompanying request entity, the type of which should be declared via a Content-Type header. If the content type is not recognized by the application, return false from this method to trigger a "415 Unsupported Media Type" response.

The basic content-types (major portions only) accepted by the application should be listed in $site->MREST_SUPPORTED_CONTENT_TYPES. Override this method if that's not good by you.

valid_entity_length (B4)

Called by Web::Machine with one argument: the length of the request body. Return true or false.

charsets_provided

This method causes Web::Machine to encode the response body (if any) in UTF-8.

FSM Part Two (Content Negotiation)

See Web::MREST::Entity.

FSM Part Three (Resource Existence)

resource_exists (G7)

The initial check for resource existence is the URI-to-resource mapping, which has already taken place in allowed_methods. Having made it to here, we know that was successful.

So, what we do here is call the handler function, which is expected to return an App::CELL::Status object. How this status is interpreted is left up to the application: we pass the status object to the mrest_resource_exists method, which should return either true or false.

For GET and POST, failure means 404 by default, but can be overrided by calling mrest_declare_status from within mrest_resource_exists.

For PUT, success means this is an update operation and failure means insert.

For DELETE, failure means "202 Accepted" - i.e. a request to delete a resource that doesn't exist is accepted, but nothing actually happens.

allow_missing_post

If the application wishes to allow POST to a non-existent resource, this method will need to be overrided.

post_is_create

mrest_post_is_create

Looks for a 'post_is_create' property in the context and returns 1 or 0, as appropriate.

create_path

mrest_create_path

This should always return _something_ (never undef)

create_path_after_handler

This is set to true so we can set $self->context->{'create_path'} in the handler.

process_post

This is where we construct responses to POST requests that do not create a new resource. Since we expect our resource handlers to "do the needful", all we need to do is call the resource handler for pass two.

The return value should be a Web::Machine/HTTP status code like, e.g., \200 - this ensures that Web::Machine does not attempt to encode the response body, as in our case this would introduce a double- encoding bug.

delete_resource

This method is called on DELETE requests and is supposed to tell Web::Machine whether or not the DELETE operation was enacted. In our case, we call the resource handler (pass two).

finish_request

This overrides the Web::Machine method of the same name, and is called just before the final response is constructed and sent. We use it for adding certain headers in every response.