Releases: Cantido/liberator
Releases · Cantido/liberator
New and more flexible callbacks, and way more
Added
New Callbacks
- The
handle_error/3
handler has been added. This is a special handler that lets you manipulate theconn
after an error is raised, so you can choose your status code and body yourself.
(docs) (#33) - The
maximum_entity_length/1
function. This is used by thevalid_entity_length?/1
callback. If the size of the request body is above this size, Liberator will return a status of413 Request Entity Too Large
. (docs) - Added the
well_formed?/1
function. This function checks the request for general adherence to some form, like if it is valid JSON. It replacesmalformed?/1
so that you can return some data after you check for form. (docs) - Added the
body_exists?/1
function. This is an internal function that, uh, checks to see if the body exists. If it does, it'll grab it, and callvalid_entity_length?/1
and the newwell_formed?/1
function. So now you can parse the body if it's there, without worrying about conditional logic if it's not there. (docs)
Additions to callbacks
- You can now return the given conn in decision functions and actions to serve as an affirmative response, as an alternative to returning a plain map, or
true
. Now you can modify the conn as you see fit. - You can now return
:ok
or:error
tuples from decisions, actions, and handlers. Returning{:error, term}
will invoke the newhandle_error/3
function.
Added internationalization
- Internationalization is now supported via
Gettext
! Liberator already finds the best language for each request, now it also sets the locale usingGettext.put_locale/1
. Just callgettext
directly in your Resources. (docs) (#8, #10)
Debugging and tracing upgrades
- Tracing individual step duration is now available. Access the
:duration
key for each decision in the tracing list to get that decision's duration, in native time units. - You can now generate a Graphviz file for either the default decision tree or your own resource's decision tree using the
mix liberator.chart
mix task. - Telemetry is now sent upon each request. Three events
[:liberator, :request, :start]
,[:liberator, :request, :stop]
, and[:liberator, :request, :exception]
are sent. See the docs forLiberator.Resource
for more information.
Docs for debugging and tracing
Changed
- The
Vary
header is now served by default, with a value ofAccept-Encoding
andAccept-Language
. - Now serves the
location
header if you've returned a map with the:location
key, or assigned it on the conn. - Some decision functions were rearranged.
- Raised errors are now wrapped in custom exceptions. They're the same errors with the same messages, just with different wrapper types.
- Entries in the trace list have changed from tuples to maps in order to support more tracing information. The step is now a map member named
:step
, and the value is:value
Deprecated
- The
malformed?/1
is now deprecated, usewell_formed?/1
instead. This lets that decision function return data, and it's the ideal place for parsing the body. (#15)
Fixed
- The
etag
header is now included in the response, if you have overridden it. (#17) - Now serves the
last-modified
header based on the return value from thelast_modified/1
callback. (#18) - Non-printable-
String
return values from handlers will now be passed throughinspect/1
when the content type istext/plain
. Printable strings will be passed through without hassle. (#7) - All responses now include an
allow
header, fixing the cases where one was required but not provided, like in anOPTIONS
request, and when returning a 405 Method Not Allowed. (#9, #12)
v1.4.0-rc.3
v1.4.0-rc.2
v1.4.0-rc.1
Tracing to logs, and new override abilities
Added
- The
:log
argument to the:trace
option. Add atrace: :log
option to your module'suse
statement,
and every request will be logged with a trace. The log message even includes a request ID fromPlug.RequestId
, if you have one. (#4) - The
:decision_tree_overrides
argument toLiberator.Resource
. This is an advanced feature that lets users override parts of the decision tree that Liberator evaluates. Want to change the ordering of some decisions, or add new ones? This is the way! (#5) - The
:handler_status_overrides
argument toLiberator.Resource
. This is an advanced feature that lets users override status codes associated with handlers. It's mostly useful for those wanting to implement their own new statuses that Liberator doesn't support. - The
:action_followup_overrides
argument toLiberator.Resource
. This is an advanced feature that lets users override the functions called immediately after actions. It's mostly useful for those wanting to implement their own new actions that Liberator doesn't support.
Statuses 402, 429, and 451
Added
- The
402 Payment Required
status, along with related callbackspayment_required?
andhandle_payment_required/1
. - The
451 Unavailable for Legal Reasons
status, along with related callbacksunavailable_for_legal_reasons?/1
andhandle_unavailable_for_legal_reasons/1
. - The
429 Too Many Requests
status, along with related callbackstoo_many_requests?/1
andhandle_too_many_requests/1
. If you return a map containing a:retry_after
value, Liberator will use that to set aretry-after
header. - You can also return a
:retry_after
value from any other decision function, likeservice_available?/1
, ormoved_permanently?/1
, for the same effect. See MDN's docs on theretry-after
header for more information on why you'd want to do this.
Fixed
- Dates in headers are now parsed properly. (#1)
Improved Content Negotiation
Added
- A
CHANGELOG.md
file. - The
:trace
option:
Addtrace: :headers
to youruse Liberator.Resource
statement to
get anx-liberator-trace
header added to responses,
and see the result of all decisions. - Compression options:
deflate
,gzip
, andidentity
.
Changed
- Codecs are now configurable.
Set the:media_types
and:encodings
map in Liberator's config to add your own codecs.
Removed
Liberator.Resource
no longer callsuse Timex
, so your context is less polluted.
Fixed
- Better wildcard handling during content negotiation
- Content negotiation actually obeys q-values for priority
First Release
Added
- Basic decision tree navigation