[[tags: egg]]
== gemini-client
[[toc:]]
=== Introduction
This egg provides a client library for the featherweight hypertext
transfer protocol, [[https://gemini.circumlunar.space/|Gemini]].
Features:
* Interprets {{gemini://}} URLs using the {{uri-generic}} egg.
* Handles Gemini's compulsory TLS encryption using the {{openssl}} egg.
* Parses the response header into a Scheme record.
* Provides a condition type for unsuccessful Gemini responses.
Gemini's standard markup language, Gemtext, is not parsed by this egg.
=== Make a request
(gemini-get uri handle-response)
Make a TLS-encrypted connection to the Gemini server at the host and
port of {{uri}} (the default port is 1965). Ask for {{uri}} and call
the procedure {{handle-response}} with the response object as an
argument.
{{uri}} must be a {{gemini://}} URI. It can be either a string or a
URI object from the {{uri-generic}} egg.
=== Response object
(gemini-response? object)
Return {{#t}} if {{object}} is a Gemini response object, {{#f}}
otherwise.
(gemini-response-code response)
Return the two-digit code at the very beginning of a Gemini response
as a integer.
(gemini-response-first-digit response)
(gemini-response-second-digit response)
Return either digit of the code as an integer. The first digit
indicates the response category, the second is a detail.
(gemini-response-success? response)
Return {{#t}} if this is a success response (code 2x), {{#f}}
otherwise.
(gemini-response-redirect? response)
Return {{#t}} if this is a redirect response (code 3x), {{#f}}
otherwise.
(gemini-response-meta response)
Return the "meta" text: the remainder of the first line of the
response after the status code.
(gemini-response-port response)
Return a binary input port from which the response body can be read.
The caller should not close the port.
(gemini-response-read-bytevector-all response)
(gemini-response-read-string-all response)
Convenience procedures to read the entire response body and return it
as as bytevector or a string, respectively.
(gemini-response-raise response)
Convenience procedure which raises an appropriate exception unless
{{response}} is a success ({{2x}}) response. The exception raised
satisfies {{gemini-error?}}, and calling {{gemini-error-response}} on
it returns {{response}}. If {{response}} is a success response,
{{gemini-response-raise}} returns {{#f}}.
=== Error object
(gemini-error? object)
Return {{#t}} if {{object}} is a Gemini error condition, {{#f}}
otherwise.
(gemini-error-response gemini-error)
Return the Gemini response object (satisfies {{gemini-response?}})
associated with the error, of {{#f}} if none.
=== Example
(display (gemini-get
"gemini://gemini.circumlunar.space/capcom/"
(lambda (response)
(or (gemini-response-raise response)
(gemini-response-read-string-all response)))))
=== Version History
* 0.1: First release.
=== Author
Lassi Kortela
=== Repository
[[https://github.com/lassik/scheme-gemini-client|
https://github.com/lassik/scheme-gemini-client]]
=== License
Copyright 2021 Lassi Kortela
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.