41baa8ec8ed6d54cf79ea122a886ac63ba9f51a2
[oonf.git] / include / oonf / subsystems / oonf_http.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon version 2 (olsrd2)
4  * Copyright (c) 2004-2015, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 /**
43  * @file
44  */
45
46 #ifndef OONF_HTTP_H_
47 #define OONF_HTTP_H_
48
49 #include <oonf/libcommon/avl.h>
50 #include <oonf/oonf.h>
51 #include <oonf/libcommon/netaddr.h>
52 #include <oonf/libcommon/netaddr_acl.h>
53 #include <oonf/libcommon/string.h>
54 #include <oonf/subsystems/oonf_stream_socket.h>
55
56 /*! subsystem identifier */
57 #define OONF_HTTP_SUBSYSTEM "http"
58
59 /*! HTTP HTML content type */
60 #define HTTP_CONTENTTYPE_HTML "text/html"
61
62 /*! HTTP text content type */
63 #define HTTP_CONTENTTYPE_TEXT "text/plain"
64
65 /**
66  * Constants for HTTP subsystem
67  */
68 enum
69 {
70   /*! maximum number of HTTP headers */
71   OONF_HTTP_MAX_HEADERS = 16,
72
73   /*! maximum number of GET/POST parameters */
74   OONF_HTTP_MAX_PARAMS = 8,
75
76   /*! maximum URI length */
77   OONF_HTTP_MAX_URI_LENGTH = 256
78 };
79
80 /**
81  * supported HTTP result codes
82  */
83 enum oonf_http_result
84 {
85   HTTP_200_OK = 200,
86   HTTP_400_BAD_REQ = 400,
87   HTTP_401_UNAUTHORIZED = 401,
88   HTTP_403_FORBIDDEN = STREAM_REQUEST_FORBIDDEN,
89   HTTP_404_NOT_FOUND = 404,
90   HTTP_413_REQUEST_TOO_LARGE = STREAM_REQUEST_TOO_LARGE,
91   HTTP_500_INTERNAL_SERVER_ERROR = 500,
92   HTTP_501_NOT_IMPLEMENTED = 501,
93   HTTP_503_SERVICE_UNAVAILABLE = STREAM_SERVICE_UNAVAILABLE,
94
95   /*! special result to signal start of file transfer */
96   HTTP_START_FILE_TRANSFER = 99999,
97 };
98
99 /**
100  * HTTP session data
101  */
102 struct oonf_http_session {
103   /*! address of remote client */
104   struct netaddr *remote;
105
106   /*! HTTP metric (get, post, ...) */
107   const char *method;
108
109   /*! HTTP request uri */
110   const char *request_uri;
111
112   /*! HTTP request URI with decoded special characters */
113   const char *decoded_request_uri;
114
115   /*! HTTP version */
116   const char *http_version;
117
118   /* TODO: replace with strarray */
119   /*! array of HTTP header field names */
120   char *header_name[OONF_HTTP_MAX_HEADERS];
121
122   /*! array of HTTP header field values */
123   char *header_value[OONF_HTTP_MAX_HEADERS];
124
125   /*! number of HTTP header fields */
126   size_t header_count;
127
128   /*! array of HTTP GET/POST keys */
129   char *param_name[OONF_HTTP_MAX_PARAMS];
130
131   /*! array of HTTP GET/POST values */
132   char *param_value[OONF_HTTP_MAX_PARAMS];
133
134   /*! number of HTTP GET/POST values */
135   size_t param_count;
136
137   /*! content type for answer, NULL means plain/html */
138   const char *content_type;
139
140   /*! file descriptor to file that is being downloaded in this session */
141   int transfer_fd;
142
143   /*! number of bytes already being downloaded */
144   size_t transfer_length;
145 };
146
147 /**
148  * HTTP handler for a directory or file
149  */
150 struct oonf_http_handler {
151   /*! hook into global http handler tree */
152   struct avl_node node;
153
154   /*! path of filename of content */
155   const char *site;
156
157   /*! set by oonf_http_add to true if site is a directory */
158   bool directory;
159
160   /*! list of base64 encoded name:password combinations */
161   struct strarray auth;
162
163   /*! list of IP addresses/ranges this site can be accessed from */
164   struct netaddr_acl acl;
165
166   /*! pointer to static content for this handler */
167   const char *content;
168
169   /*! length of static content in bytes */
170   size_t content_size;
171
172   /**
173    * Callback to generate dynamic content
174    * This is called if the content variable is NULL.
175    * @param out output buffer for content
176    * @param session http session object
177    * @return http result
178    */
179   enum oonf_http_result (*content_handler)(struct autobuf *out, struct oonf_http_session *session);
180 };
181
182 EXPORT void oonf_http_add(struct oonf_http_handler *);
183 EXPORT void oonf_http_remove(struct oonf_http_handler *);
184
185 EXPORT const char *oonf_http_lookup_value(char **keys, char **values, size_t count, const char *key);
186
187 /**
188  * Lookup the value of one http header field.
189  * @param session pointer to http session
190  * @param key header field name
191  * @return header field value or NULL if not found
192  */
193 static INLINE const char *
194 oonf_http_lookup_header(struct oonf_http_session *session, const char *key) {
195   return oonf_http_lookup_value(session->header_name, session->header_value, session->header_count, key);
196 }
197
198 /**
199  * Lookup the value of one http request parameter delivered by GET
200  * @param session pointer to http session
201  * @param key header field name
202  * @return parameter value or NULL if not found
203  */
204 static INLINE const char *
205 oonf_http_lookup_param(struct oonf_http_session *session, const char *key) {
206   return oonf_http_lookup_value(session->param_name, session->param_value, session->param_count, key);
207 }
208
209 #endif /* OONF_HTTP_H_ */