Class: Takagi::ResponseBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/takagi/response_builder.rb

Overview

Builds CoAP responses from middleware results

Constant Summary collapse

DEFAULT_RESPONSE_CODE =
CoAP::Registries::Response::CONTENT

Class Method Summary collapse

Class Method Details

.build(inbound_request, result, logger: nil) ⇒ Takagi::Message::Outbound

Builds a response from the middleware result

Parameters:

Returns:



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/takagi/response_builder.rb', line 17

def self.build(inbound_request, result, logger: nil)
  Takagi::Hooks.emit(:before_response_build, inbound: inbound_request, result: result)

  case result
  when Takagi::Message::Outbound
    response = result
  when Hash, String
    logger&.debug("Returned #{result.class} as response")
    response = respond(inbound_request, result, logger: logger)
  else
    logger&.warn("Middleware returned non-Hash: #{result.inspect}")
    response = inbound_request.to_response('5.00 Internal Server Error', { error: 'Internal Server Error' })
  end

  Takagi::Hooks.emit(:after_response_build, inbound: inbound_request, response: response, result: result)
  response
end

.respond(inbound_request, payload, code: DEFAULT_RESPONSE_CODE, formats: nil, force: nil, options: {}, logger: nil) ⇒ Takagi::Message::Outbound

Build a CoAP response with content-format negotiation.

Parameters:

  • inbound_request (Takagi::Message::Inbound)

    The original request

  • payload (Object)

    The payload to serialize

  • code (Integer, String, Symbol) (defaults to: DEFAULT_RESPONSE_CODE)

    CoAP response code (default 2.05 Content)

  • formats (Array<Integer, Symbol, String>, nil) (defaults to: nil)

    Allowed content-format codes

  • force (Integer, Symbol, String, nil) (defaults to: nil)

    Force a specific content-format code

  • options (Hash) (defaults to: {})

    Additional CoAP options

  • logger (Logger, nil) (defaults to: nil)

    Logger for debug output

Returns:



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/takagi/response_builder.rb', line 45

def self.respond(inbound_request, payload, code: DEFAULT_RESPONSE_CODE, formats: nil, force: nil, options: {}, logger: nil)
  requested_formats = formats || inbound_request&.content_format
  allowed_formats = normalize_formats(requested_formats)
  forced_format = normalize_format(force)
  accept_format = normalize_format(extract_accept(inbound_request))

  selected_format = select_format(allowed_formats, accept_format, forced_format, logger)

  case selected_format
  when :not_acceptable
    return inbound_request.to_response(CoAP::Registries::Response::NOT_ACCEPTABLE, { error: 'Not Acceptable' })
  when :unsupported
    return inbound_request.to_response(CoAP::Registries::Response::UNSUPPORTED_CONTENT_FORMAT, { error: 'Unsupported Content-Format' })
  end

  content_options = (options || {}).dup
  if selected_format
    content_options[CoAP::Registries::Option::CONTENT_FORMAT] ||= [selected_format]
  end

  inbound_request.to_response(code, payload, options: content_options)
end