module Respond

A controller layer which provides a convenient way to respond to different requested content types. The order in which you add converters matters, as it determines how the incoming Accept: header is mapped, e.g. the first converter is also defined as matching the media range /.

Classes and Modules

module ClassMethods

Defines response handlers on controller classes.

Definitions

def self.prepended(base)

Extend a controller class with response negotiation.

Signature

parameter base Class

The controller class.

returns Class

The extended controller class.

Implementation

def self.prepended(base)
	base.extend(ClassMethods)
end

def response_for(request, result)

Build a protocol response for a semantic controller result.

Signature

parameter request Utopia::Request

The request.

parameter result Controller::Result

The semantic controller result.

returns Protocol::HTTP::Response

The response.

Implementation

def response_for(request, result)
	if response = self.class.response_for(self, request, result.value)
		content_type, body = response
		headers = result.headers.dup
		
		if content_type
			headers[HTTP::CONTENT_TYPE] = content_type.to_s
		end
		
		return Utopia::Response[result.status, headers, body]
	end
	
	raise TypeError, "Could not negotiate a response for #{result.value.class}!"
end

def process!(request, path)

Serialize semantic controller results, while passing complete protocol responses through unchanged.

Implementation

def process!(request, path)
	result = super
	
	case result
	when Result
		return self.response_for(request, result)
	else
		return result
	end
end