@slick_kilmister/tiny-pdf-server
v1.0.7
Published
A tiny development server. If you don't already know what it does, you're probably not supposed to be using it.
Downloads
11
Readme
Tiny PDF Server
A tiny development server. If you don't already know what it does, you're probably not supposed to be using it.
Install globally with npm i -g @slick_kilmister/tiny-pdf-server.
Run tinypdfserver -h for information on how to use the cli.
The symbols used in this document are explained in appendix a
Features
Requests
The server is able to process the following requests. They are referred to in this document by the given name.
| name | request path | query contains | response body if successful |
|----------|---------------------------|--------------------------|-----------------------------|
| !fetch | /getDocument | type, id | contentfile |
| !match | /getDocumentsByProperty | key, [value] | xml-list of batches |
Respected Request Headers
The set of header fields the server uses is the bare minimum, all other fields are ignored.
:path:method
Response Header
!fetch Request
The response comes with a decent set of headers including useful status codes, mimetype, size of response body, and last modified date for caching.
| header | values |
|------------------|---------------------------------------------------------------------------------|
| :status: | 200, 400, 404, 405, 500 |
| content-type: | value given in //primarycontent/@mimetype + (if text/* "; charset=utf-8") |
| date | GMT date+time |
| last-modified | mtime of content file in GMT format |
| content length | size in bytes |
!match Request
The response comes with a limited set of headers
| header | values |
|-----------------|----------------------------|
| :status: | 200, 400, 405, 500 |
| content-type: | application/xml |
| date | GMT date+time |
Causes for Status Codes
Table of possible status codes and their causes.
-- request path isn't getDocument
| code | name | returned when |
|------:|---------------------------|-----------------------------------------------------------------------------|
| 200 | ok (!fetch) | successfully resolved type and id query params to a content file |
| 200 | ok (!match) | successfully resolved key and value query params to a list of documents |
| 400 | bad request | request path isn't getDocument or getDocumentsByProperty |
| 400 | bad request (!fetch) | query params don't include both type and id |
| 400 | bad request (!match) | query params don't include key |
| 404 | file not found (!fetch) | could not find a resource xml-file for a given type-id combo |
| --- | file not found (!match) | not possible, if no match is found, returns an empty element |
| 405 | method not allowed | request specified any method besides GET (takes precedence over 400) |
| 500 | internal server error | see server behavior for details |
Server Behavior
- Any log entry that coincides with a
500status code will be logged tostderr, anything else is logged tostdout. - The server inherently knows wether
stdoutandstderrsupport colors and will format its output accordingly. - The server supports standard redirecting of
stdoutandstderr. eg.tinypdfserver config.json >>out.log 2>>err.logwill appendstdouttoout.logandstderrtoerr.logtinypdfserver config.json >>out.log 2>&1will appendstdoutandstderrtoout.logtinypdfserver config.json >out.log 2>err.logwill overwriteout.logwithstdoutanderr.logwithstderr
Core Routine
- if
:methodis notGET- break (code:
405; logs:<:method>; <code>)
- break (code:
- switch on:
:pathstarts with- case
/getDocument?- if query doesn't contain
?typeand?id- switch to default
- if no match for
dockey- break (code
404; logs:<dockey>; <code>)
- break (code
- if any of the following:
- error reading
docfile docfilehas unexpected shapedocfilepoints to non-existentcontentfile- error reading
contentfile
- error reading
- then:
- break (code
500; logs: error message)
- break (code
- send
contentfile- on success:
- break (code:
200; logs:<dockey>; <contentfile name>; <code>)
- break (code:
- on error:
- break (code:
500; logs: error message)
- break (code:
- on success:
- if query doesn't contain
- case
/getDocumentsByProperty?- if query doesn't contain
?name- switch to default
- send
doclist start - repeat with every file in xml-directory
- if filename doesn't end with
.xml- continue
- if any of the following:
- error reading
docfile docfilehas unexpected shape
- error reading
- then:
- continue (logs: acknowledgement)
- if
batchmatches query parameters- send
batch
- send
- if filename doesn't end with
- send
doclist end- on success:
- break (code:
200; logs:<?name>; <?value>; <# of matches>; <code>)
- break (code:
- on error:
- break (code:
500; logs: error message)
- break (code:
- on success:
- if query doesn't contain
- default:
:pathis invalid- break (code: 400, logs:
<:path>; <code>)
- break (code: 400, logs:
- case
- client prematurely closed connection
- break (logs acknowledgement)
- end
Appendix A
List of symbols used in this document and their meaning
| symbol | refers to |
|--------------------------|----------------------------------------------------------------------------------|
| :method | :path | value of http pseudo-header-field value |
| !<req> | a request of a given type as defined in request |
| ?<name> | value of the query parameter <name> |
| well-formed <type> | a valid piece of data of type <type> as described in appendix b |
| dockey | ?type/?id-pair of a !fetch request joined by _ |
| docfile | a data-file used by the server |
| batch | the data-structure described by a well-formed docfile |
| contentfile | the file specified in an xml well-formed docfile |
| code | http status code |
| doclist | the xml return by a !match request |
| doclist start | xml-declaration and opening tag of topmost element |
| doclist end | |
Appendix B
- The
well-formedqualifier indicates some piece of data SHOULD NOT result in an error when processed by the server. Specific types are described in the following table - The
malformedqualifier indicates some piece of data WILL result in an error when processed by the server. It's definition is implicit as anything that doesn't qualify aswell-formed.
Description of well-formed types, denoted by "well-formed <type>"
| type | description |
|-----------|-------------------------------------------------------------------------------------|
| request | any request described in requests |
| docfile | an xml document of usable shape as described in the next section |
Document Shape
A well-formed docfile has the following structure:
- an optional xml-declaration (
<?xml version="1.0" encoding="utf-8" ?>if absent), - one
<batch>element containing- one
<document>element containing- any number of
<property>elements with- a
nameattribute - an optional
valueattribute (nullif absent)
- a
- one
<primarycontent>element- with an optional
mimetypeattribute (application/pdfif absent) - containing one
<file>element with acontentfileattribute
- with an optional
- any number of
- one
