Giter Site home page Giter Site logo

cowmachine's Introduction

Test Hex.pm version Hex.pm Downloads Hex.pm Documentation Erlang Versions License

Cowmachine

Webmachine for Zotonic and Cowboy

This is an adaptation of https://github.com/webmachine/webmachine for the Cowboy web server.

Cowmachine is a request handler for Cowboy.

Main differences with Basho’s Webmachine are:

  • Use cowboy instead of mochiweb for the http server
  • Separate dispatching
  • Simplified callbacks
  • Single process/4 callback for all http methods
  • Caching of some callbacks (like modified)
  • More streaming options for returned data
  • Better support for range requests

Installation

Cowmachine is at Hex, in your rebar.config file use:

{deps, [
    cowmachine
]}.

You can also use the direct Git url and use the development version:

{deps, [
    {cowmachine, {git, "https://github.com/zotonic/cowmachine.git", {branch, "master"}}}
]}.

Calling Cowmachine

Cowmachine can be called from your Cowboy middleware:

-spec execute(Req, Env) -> {ok, Req, Env} | {stop, Req}
    when Req::cowboy_req:req(), Env::cowboy_middleware:env().
execute(Req, Env) ->
    % Replace below with your own controller module and optionally wrap
    % the request in your own request-context record or map.
    EnvController = Env#{
        cowmachine_controller => mycontroller
    },
    RequestContext = cowmachine_req:init_context(Req, EnvController, #{}),
    % Set options for the cowmachine
    Options = #{
        on_request =>
            fun(Ctx) ->
                % Perform anything after initialization of your request
                % Examples are checking special cookies, changing headers, etc.
                Ctx
            end,
        on_welformed =>
            fun(Ctx) ->
                % Perform anything after well-formedness check of your request
                % Examples are parsing the query args, or authentication
                Ctx
            end,
        on_handled =>
            fun(Ctx) ->
                % Perform anything after processing, before sending the result.
                Ctx
            end
    },
    % Handle the request, returns updated Req and Env for next Cowboy middleware
    cowmachine:request(RequestContext, Options).

Or just use the default Cowmachine middleware:

    #{
        middlewares => [
            % ... add your dispatcher middlware
            cowmachine
        ],
        request_timeout => 60000,
        env => #{
            % If no dispatcher, default to `mycontroller` as the cowmachine
            % controller.
            cowmachine_controller => mycontroller
        }
    }.

Dispatching

You can use the Zotonic Dispatch Compiler to match your controller paths against the request.

Controller

The controller provides the callbacks to handle the request.

The controller is an Erlang module implementing callback functions, only functions that return some non-default value need to be implemented.

For the controller callbacks and more documentation, check the wiki pages.

Documentation generation

Edoc

Generate public API

rebar3 edoc

Generate private API

rebar3 as edoc_private edoc

ExDoc

rebar3 ex_doc --logo doc/img/logo.png --output edoc -f html

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.