about summary refs log tree commit diff
path: root/cgiutil.h
blob: f809b25b27f061853cdedf9620d05d23ab60697f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*!
 * @file cgiutil.h
 * @brief Simple CGI/HTTP helper functions used by sternenblog.
 */

#include <stdbool.h>

/*!
 * @brief Print a HTTP header
 *
 * Prints a HTTP Header to `stdout` like CGI requires.
 *
 * @param key Name of the HTTP Header
 * @param val Contents of the header to send
 */
void send_header(char key[], char val[]);

/*!
 * @brief Print end of HTTP header section
 *
 * Terminates the header section of a CGI/HTTP Response by printing `\r\n` to `stdout`.
 */
void terminate_headers(void);

/*!
 * @brief Value of a HTTP status header for a given status code.
 *
 * Helper function that returns the status code plus its
 * accompanying reason phrase as a string.
 *
 * The value is statically allocated so do not attempt
 * to free it.
 *
 * Example usage:
 *
 * ```
 * send_header("Status", http_status_line(404);
 * // Prints: Status: 404 Not Found
 * ```
 *
 * @param status HTTP status code
 * @return status code and reason phrase as a string.
 */
char *http_status_line(int status);

/*!
 * @brief Return HTTP error code for given errno
 *
 * Incomplete mapping of `errno`s to HTTP error codes.
 * Defaults to 500.
 *
 * @param err POSIX errno
 * @return HTTP error code
 */
int http_errno(int err);

/*!
 * @brief Urlencode a given dynamically allocated string
 *
 * urlencode_realloc() receives a pointer to a pointer to
 * a dynamically allocated string to encode plus its size
 * including the null byte at the end.
 *
 * It then replaces every reserved character in the string
 * except `/` with the appropriate percent encoding. If
 * the size of the buffer is not enough, it uses `realloc()`
 * to increase it.
 *
 * Note that the implementation of url encoding is not 100%
 * correct, but should be good enough in the context of
 * sternenblog. `/` is not encoded since on unix
 * a slash should always a path delimiter and never part of
 * a filename. Another limitation of the url encoding is
 * that it only checks for a list of characters to encode
 * instead of checking if the characters are unreserved
 * and don't need to be encoded which would be more correct.
 * The approach taken has the big advantage that we don't
 * need to worry about UTF-8, which makes the implementation
 * considerably simpler. As a consequence however it will
 * be not aggressive enough in terms of encoding in some
 * cases.
 *
 * On error -1 is returned. In such a case the original
 * pointer remains intact, so you can either `free()` it
 * or continue with the unencoded string.
 *
 * Otherwise it returns new size of the buffer.
 *
 * @param **input pointer to input string
 * @param size size of input string including null byte
 * @return -1 on error, else size of buffer
 */
int urlencode_realloc(char **input, int size);

/*!
 * @brief Returns URL of server addressed by the current CGI request
 *
 * server_url() uses the CGI 1.1 environment variables `SERVER_NAME`
 * and `SERVER_PORT` to construct an URL to the server the current
 * request is addressed to. Since CGI only reveals the HTTP version
 * used and not wether an encrypted version of HTTP is used,
 * server_url() will use the parameter `https` to decide which protocol
 * identifier to prefix.
 *
 * The returned `char *` is dynamically allocated and must be cleaned
 * up using `free()` before it goes out of scope.
 *
 * @param https if true, prefix `https://` else `http://`
 * @return Pointer to dynamically allocated char buffer containing the URL.
 */
char *server_url(bool https);