Module: Roda::RodaPlugins::JsonParser

Defined in:
lib/roda/plugins/json_parser.rb

Overview

The json_parser plugin parses request bodies in JSON format if the request’s content type specifies json. This is mostly designed for use with JSON API sites.

This only parses the request body as JSON if the Content-Type header for the request includes “json”.

The parsed JSON body will be available in r.POST, just as a parsed HTML form body would be. It will also be available in r.params (which merges r.GET with r.POST).

Defined Under Namespace

Modules: RequestMethods

Constant Summary collapse

DEFAULT_ERROR_HANDLER =
proc{|r| r.halt [400, {}, []]}

Class Method Summary collapse

Class Method Details

.configure(app, opts = OPTS) ⇒ Object

Handle options for the json_parser plugin:

:error_handler

A proc to call if an exception is raised when parsing a JSON request body. The proc is called with the request object, and should probably call halt on the request or raise an exception.

:parser

The parser to use for parsing incoming json. Should be an object that responds to call(str) and returns the parsed data. The default is to call JSON.parse.

:include_request

If true, the parser will be called with the request object as the second argument, so the parser needs to respond to call(str, request).

:wrap

Whether to wrap uploaded JSON data in a hash with a “_json” key. Without this, calls to r.params will fail if a non-Hash (such as an array) is uploaded in JSON format. A value of :always will wrap all values, and a value of :unless_hash will only wrap values that are not already hashes.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/roda/plugins/json_parser.rb', line 36

def self.configure(app, opts=OPTS)
  app.opts[:json_parser_error_handler] = opts[:error_handler] || app.opts[:json_parser_error_handler] || DEFAULT_ERROR_HANDLER
  app.opts[:json_parser_parser] = opts[:parser] || app.opts[:json_parser_parser] || app.opts[:json_parser] || JSON.method(:parse)
  app.opts[:json_parser_include_request] = opts[:include_request] if opts.has_key?(:include_request)

  case opts[:wrap]
  when :unless_hash, :always
    app.opts[:json_parser_wrap] = opts[:wrap]
  when nil
    # Nothing
  else
    raise RodaError, "unsupported option value for json_parser plugin :wrap option: #{opts[:wrap].inspect} (should be :unless_hash or :always)"
  end
end