scheme-libraries/retropikzel/cgi/README.md

136 lines
3.1 KiB
Markdown

R7RS Scheme library for Common Gateway Interface
If you dont know what CGI is, in short server runs your Scheme script and
displays it's output as a webpage. Also checkout
[https://git.sr.ht/~retropikzel/scheme-php](https://git.sr.ht/~retropikzel/scheme-php).
[Project](https://sr.ht/~retropikzel/scheme-cgi/)
[Repository](https://git.sr.ht/~retropikzel/scheme-cgi)
[Issue tracker](https://todo.sr.ht/~retropikzel/scheme-cgi)
## Caveats
- Works only on unix as it reads from /dev/fd/0 and /dev/random.
## Buggy on implementations
- Does not work with mit-scheme
- For some reason mit-scheme exits when it reads eof-object from standard
input
- STklos
- No output for some reason
## How to use
Example using Gauche in Docker.
lighttpd.conf:
server.document-root = "/workdir"
server.port = 3000
server.modules += ("mod_cgi", "mod_dirlisting")
cgi.assign = (".scm" => "/usr/bin/scheme-script")
dir-listing.activate = "enable"
Dockerfile:
FROM schemers/gauche
RUN apt-get update && apt-get install -y --no-install-recommends lighttpd
WORKDIR /workdir
EXPOSE 3000
COPY lighttpd.conf /lighttpd.conf
RUN echo "#!/bin/sh" > /usr/bin/scheme-script
RUN echo "exec gosh -r7 -I ./snow \$@" >> /usr/bin/scheme-script
RUN chmod +x /usr/bin/scheme-script
ENTRYPOINT ["/usr/sbin/lighttpd", "-D", "-f", "/lighttpd.conf"]
hello.scm:
(import (scheme base)
(scheme write)
(retropikzel cgi))
(display "Content-type: text/html")
(display "\r\n")
(display "\r\n")
(display "Hello")
(display "</br>")
(display "Request: ")
(write (get-request))
(display "</br>")
(cgi-exit)
Run:
docker build . --tag=scheme-cgi
docker run -it -v ${PWD}:/workdir -p 3000:3000 scheme-cgi
Then navigate with your browser to http://127.0.0.1:3000
## Documentation
### Reference
**get-request**
Returns the whole request as association list.
**get-header** _name_
Name can be symbol or a string. Returns the value of given header or #f.
**get-headers**
Returns association list of all headers.
**get-parameter** _name_
Name can be symbol or a string. Returns the value of given parameter or #f.
**get-parameters**
Returns association list of all parameters.
**get-cookie** _name_
Returns the value of given cookie or #f if.
**get-cookies**
Returns association list of all cookies.
**get-file** _filename_
Filename is a symbol or a string. Returns the path of given file from files or #f.
Uploaded files are stored in /tmp, with randomly generated prefix on their
name. They are not deleted unless cgi-exit is called. Use **move-file** to move
them into preferred location.
**get-files**
Returns association list of all files.
**move-file** _from_ _to_
Moves a file from _from_ path to _to_ path.
**get-body**
Returns the request body.
**cgi-exit**</br>
**cgi-exit** _code_
Does necessary cleanup and exits the script. Code is a number, if it is given
then that is used as exit code.
### Environment variables
**SCHEME\_CGI\_TMP\_PATH**
Path to where uploaded files are stored. Default is /tmp.