Remove memory allocation in olsr_timer_add()
[oonf.git] / src / core / olsr_http.h
1 /*
2  * olsr_http.h
3  *
4  *  Created on: Oct 5, 2011
5  *      Author: rogge
6  */
7
8 #ifndef OLSR_HTTP_H_
9 #define OLSR_HTTP_H_
10
11 #include "common/common_types.h"
12 #include "common/avl.h"
13 #include "common/string.h"
14
15 #include "core/olsr_stream_socket.h"
16 #include "core/olsr_netaddr_acl.h"
17
18 #define OLSR_HTTP_MAX_HEADERS 16
19 #define OLSR_HTTP_MAX_PARAMS 8
20 #define OLSR_HTTP_MAX_URI_LENGTH 256
21
22 enum olsr_http_result {
23   HTTP_200_OK = 200,
24   HTTP_400_BAD_REQ = 400,
25   HTTP_401_UNAUTHORIZED = 401,
26   HTTP_403_FORBIDDEN = STREAM_REQUEST_FORBIDDEN,
27   HTTP_404_NOT_FOUND = 404,
28   HTTP_413_REQUEST_TOO_LARGE = STREAM_REQUEST_TOO_LARGE,
29   HTTP_501_NOT_IMPLEMENTED = 501,
30   HTTP_503_SERVICE_UNAVAILABLE = STREAM_SERVICE_UNAVAILABLE,
31 };
32
33 struct olsr_http_session {
34   /* address of remote client */
35   struct netaddr *remote;
36
37   const char *method; /* get/post/... */
38   const char *request_uri;
39   const char *http_version;
40
41   char *header_name[OLSR_HTTP_MAX_HEADERS];
42   char *header_value[OLSR_HTTP_MAX_HEADERS];
43   size_t header_count;
44
45   /* parameter of the URI for GET/POST */
46   char *param_name[OLSR_HTTP_MAX_PARAMS];
47   char *param_value[OLSR_HTTP_MAX_PARAMS];
48   size_t param_count;
49
50   /* content type for answer, NULL means plain/html */
51   const char *content_type;
52 };
53
54 struct olsr_http_handler {
55   struct avl_node node;
56
57   /* path of filename of content */
58   const char *site;
59
60   /* set by olsr_http_add to true if site is a directory */
61   bool directory;
62
63   /* list of base64 encoded name:password combinations */
64   struct strarray auth;
65
66   /* list of IP addresses/ranges this site can be accessed from */
67   struct olsr_netaddr_acl acl;
68
69   /* pointer to static content and length in bytes */
70   const char *content;
71   size_t content_size;
72
73   /* callback for custom generated content (called if content==NULL) */
74   enum olsr_http_result (*content_handler)(
75       struct autobuf *out, struct olsr_http_session *);
76 };
77
78 EXPORT extern const char *HTTP_CONTENTTYPE_HTML;
79 EXPORT extern const char *HTTP_CONTENTTYPE_TEXT;
80
81 EXPORT void olsr_http_init(void);
82 EXPORT void olsr_http_cleanup(void);
83
84 EXPORT void olsr_http_add(struct olsr_http_handler *);
85 EXPORT void olsr_http_remove(struct olsr_http_handler *);
86
87 EXPORT const char *olsr_http_lookup_value(char **keys, char **values,
88     size_t count, const char *key);
89
90 /**
91  * Lookup the value of one http header field.
92  * @param session pointer to http session
93  * @param key header field name
94  * @return header field value or NULL if not found
95  */
96 static INLINE const char *
97 olsr_http_lookup_header(struct olsr_http_session *session, const char *key) {
98   return olsr_http_lookup_value(session->header_name, session->header_value,
99       session->header_count, key);
100 }
101
102 /**
103  * Lookup the value of one http request parameter delivered by GET
104  * @param session pointer to http session
105  * @param key header field name
106  * @return parameter value or NULL if not found
107  */
108 static INLINE const char *
109 olsr_http_lookup_param(struct olsr_http_session *session, const char *key) {
110   return olsr_http_lookup_value(session->param_name, session->param_value,
111       session->param_count, key);
112 }
113
114 #endif /* OLSR_HTTP_H_ */