Fawkes API  Fawkes Development Version
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
reply.h
1 
2 /***************************************************************************
3  * reply.h - Web request reply
4  *
5  * Created: Wed Oct 22 18:49:35 2008
6  * Copyright 2006-2009 Tim Niemueller [www.niemueller.de]
7  *
8  ****************************************************************************/
9 
10 /* This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Library General Public License for more details.
19  *
20  * Read the full text in the LICENSE.GPL file in the doc directory.
21  */
22 
23 #ifndef __LIBS_WEBVIEW_REPLY_H_
24 #define __LIBS_WEBVIEW_REPLY_H_
25 
26 #include <map>
27 #include <string>
28 
29 namespace fawkes {
30 #if 0 /* just to make Emacs auto-indent happy */
31 }
32 #endif
33 
34 class WebReply
35 {
36  public:
37  /** HTTP response code. */
38  typedef enum {
39  HTTP_CONTINUE = 100, /**< CONTINUE */
40  HTTP_SWITCHING_PROTOCOLS = 101, /**< SWITCHING_PROTOCOLS */
41  HTTP_PROCESSING = 102, /**< PROCESSING */
42 
43  HTTP_OK = 200, /**< OK */
44  HTTP_CREATED = 201, /**< CREATED */
45  HTTP_ACCEPTED = 202, /**< ACCEPTED */
46  HTTP_NON_AUTHORITATIVE_INFORMATION = 203, /**< NON_AUTHORITATIVE_INFORMATION */
47  HTTP_NO_CONTENT = 204, /**< NO_CONTENT */
48  HTTP_RESET_CONTENT = 205, /**< RESET_CONTENT */
49  HTTP_PARTIAL_CONTENT = 206, /**< PARTIAL_CONTENT */
50  HTTP_MULTI_STATUS = 207, /**< MULTI_STATUS */
51 
52  HTTP_MULTIPLE_CHOICES = 300, /**< MULTIPLE_CHOICES */
53  HTTP_MOVED_PERMANENTLY = 301, /**< MOVED_PERMANENTLY */
54  HTTP_FOUND = 302, /**< FOUND */
55  HTTP_SEE_OTHER = 303, /**< SEE_OTHER */
56  HTTP_NOT_MODIFIED = 304, /**< NOT_MODIFIED */
57  HTTP_USE_PROXY = 305, /**< USE_PROXY */
58  HTTP_SWITCH_PROXY = 306, /**< SWITCH_PROXY */
59  HTTP_TEMPORARY_REDIRECT = 307, /**< TEMPORARY_REDIRECT */
60 
61  HTTP_BAD_REQUEST = 400, /**< BAD_REQUEST */
62  HTTP_UNAUTHORIZED = 401, /**< UNAUTHORIZED */
63  HTTP_PAYMENT_REQUIRED = 402, /**< PAYMENT_REQUIRED */
64  HTTP_FORBIDDEN = 403, /**< FORBIDDEN */
65  HTTP_NOT_FOUND = 404, /**< NOT_FOUND */
66  HTTP_METHOD_NOT_ALLOWED = 405, /**< METHOD_NOT_ALLOWED */
67  HTTP_METHOD_NOT_ACCEPTABLE = 406, /**< METHOD_NOT_ACCEPTABLE */
68  HTTP_PROXY_AUTHENTICATION_REQUIRED = 407, /**< PROXY_AUTHENTICATION_REQUIRED */
69  HTTP_REQUEST_TIMEOUT = 408, /**< REQUEST_TIMEOUT */
70  HTTP_CONFLICT = 409, /**< CONFLICT */
71  HTTP_GONE = 410, /**< GONE */
72  HTTP_LENGTH_REQUIRED = 411, /**< LENGTH_REQUIRED */
73  HTTP_PRECONDITION_FAILED = 412, /**< PRECONDITION_FAILED */
74  HTTP_REQUEST_ENTITY_TOO_LARGE = 413, /**< REQUEST_ENTITY_TOO_LARGE */
75  HTTP_REQUEST_URI_TOO_LONG = 414, /**< REQUEST_URI_TOO_LONG */
76  HTTP_UNSUPPORTED_MEDIA_TYPE = 415, /**< UNSUPPORTED_MEDIA_TYPE */
77  HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416, /**< REQUESTED_RANGE_NOT_SATISFIABLE */
78  HTTP_EXPECTATION_FAILED = 417, /**< EXPECTATION_FAILED */
79  HTTP_UNPROCESSABLE_ENTITY = 422, /**< UNPROCESSABLE_ENTITY */
80  HTTP_LOCKED = 423, /**< LOCKED */
81  HTTP_FAILED_DEPENDENCY = 424, /**< FAILED_DEPENDENCY */
82  HTTP_UNORDERED_COLLECTION = 425, /**< UNORDERED_COLLECTION */
83  HTTP_UPGRADE_REQUIRED = 426, /**< UPGRADE_REQUIRED */
84  HTTP_RETRY_WITH = 449, /**< RETRY_WITH */
85 
86  HTTP_INTERNAL_SERVER_ERROR = 500, /**< INTERNAL_SERVER_ERROR */
87  HTTP_NOT_IMPLEMENTED = 501, /**< NOT_IMPLEMENTED */
88  HTTP_BAD_GATEWAY = 502, /**< BAD_GATEWAY */
89  HTTP_SERVICE_UNAVAILABLE = 503, /**< SERVICE_UNAVAILABLE */
90  HTTP_GATEWAY_TIMEOUT = 504, /**< GATEWAY_TIMEOUT */
91  HTTP_HTTP_VERSION_NOT_SUPPORTED = 505, /**< HTTP_VERSION_NOT_SUPPORTED */
92  HTTP_VARIANT_ALSO_NEGOTIATES = 506, /**< VARIANT_ALSO_NEGOTIATES */
93  HTTP_INSUFFICIENT_STORAGE = 507, /**< INSUFFICIENT_STORAGE */
94  HTTP_BANDWIDTH_LIMIT_EXCEEDED = 509, /**< BANDWIDTH_LIMIT_EXCEEDED */
95  HTTP_NOT_EXTENDED = 510 /**< NOT_EXTENDED */
96  } response_code_t;
97 
98  /** Map of headers. */
99  typedef std::map<std::string, std::string> HeaderMap;
100 
102  virtual ~WebReply();
103 
104  response_code_t code() const;
105  void add_header(std::string header, std::string content);
106  void add_header(std::string header_string);
107  const HeaderMap & headers() const;
108 
109 
110  private:
111  response_code_t __code;
112  HeaderMap __headers;
113 };
114 
115 class DynamicWebReply : public WebReply
116 {
117  public:
119 
120  virtual size_t chunk_size();
121  virtual size_t size() = 0;
122  virtual size_t next_chunk(size_t pos, char *buffer, size_t buf_max_size) = 0;
123 };
124 
125 class StaticWebReply : public WebReply
126 {
127  public:
128  StaticWebReply(response_code_t code, std::string body = "");
129 
130  void append_body(const char *format, ...);
131  StaticWebReply & operator+=(std::string text);
132 
133  virtual const std::string & body();
134  virtual std::string::size_type body_length();
135 
136  virtual void pack();
137  protected:
138  /** Body of the reply. */
139  std::string _body;
140 };
141 
142 } // end namespace fawkes
143 
144 #endif