Fawkes API
Fawkes Development Version
|
00001 00002 /*************************************************************************** 00003 * error_reply.h - Web request reply for an error page 00004 * 00005 * Created: Fri Oct 24 19:57:19 2008 00006 * Copyright 2006-2009 Tim Niemueller [www.niemueller.de] 00007 * 00008 ****************************************************************************/ 00009 00010 /* This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2 of the License, or 00013 * (at your option) any later version. 00014 * 00015 * This program is distributed in the hope that it will be useful, 00016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 * GNU Library General Public License for more details. 00019 * 00020 * Read the full text in the LICENSE.GPL file in the doc directory. 00021 */ 00022 00023 #include <webview/error_reply.h> 00024 00025 #include <core/exceptions/software.h> 00026 #include <cstdio> 00027 #include <cstdlib> 00028 00029 namespace fawkes { 00030 #if 0 /* just to make Emacs auto-indent happy */ 00031 } 00032 #endif 00033 00034 /** @class WebErrorPageReply <webview/error_reply.h> 00035 * Static error page reply. 00036 * Shows a simple error page based on the given code. 00037 * @author Tim Niemueller 00038 */ 00039 00040 /** Constructor. 00041 * @param code error code, must be a 4xx or 5xx HTTP code 00042 * @param format format for additional error message, use format as 00043 * known from sprintf. 00044 */ 00045 WebErrorPageReply::WebErrorPageReply(response_code_t code, 00046 const char *format, ...) 00047 : WebPageReply(code) 00048 { 00049 if ( (code < 400) || (code > 599) ) { 00050 throw fawkes::OutOfBoundsException("Error code invalid", code, 400, 599); 00051 } 00052 00053 switch (code) { 00054 case HTTP_BAD_REQUEST: 00055 _title = "400 BAD_REQUEST"; 00056 _body = "<h1>400 BAD_REQUEST</h1>"; 00057 break; 00058 00059 case HTTP_UNAUTHORIZED: 00060 _title = "401 UNAUTHORIZED"; 00061 _body = "<h1>401 UNAUTHORIZED</h1>"; 00062 break; 00063 00064 case HTTP_PAYMENT_REQUIRED: 00065 _title = "402 PAYMENT_REQUIRED"; 00066 _body = "<h1>402 PAYMENT_REQUIRED</h1>"; 00067 break; 00068 00069 case HTTP_FORBIDDEN: 00070 _title = "403 FORBIDDEN"; 00071 _body = "<h1>403 FORBIDDEN</h1>"; 00072 break; 00073 00074 case HTTP_NOT_FOUND: 00075 _title = "404 NOT_FOUND"; 00076 _body = "<h1>404 NOT_FOUND</h1>"; break; 00077 00078 case HTTP_METHOD_NOT_ALLOWED: 00079 _title = "405 METHOD_NOT_ALLOWED"; 00080 _body = "<h1>405 METHOD_NOT_ALLOWED</h1>"; 00081 break; 00082 00083 case HTTP_METHOD_NOT_ACCEPTABLE: 00084 _title = "406 METHOD_NOT_ACCEPTABLE"; 00085 _body = "<h1>406 METHOD_NOT_ACCEPTABLE</h1>"; 00086 break; 00087 00088 case HTTP_PROXY_AUTHENTICATION_REQUIRED: 00089 _title = "407 PROXY_AUTHENTICATION_REQUIRED"; 00090 _body = "<h1>407 PROXY_AUTHENTICATION_REQUIRED</h1>"; 00091 break; 00092 00093 case HTTP_REQUEST_TIMEOUT: 00094 _title = "408 REQUEST_TIMEOUT"; 00095 _body = "<h1>408 REQUEST_TIMEOUT</h1>"; 00096 break; 00097 00098 case HTTP_CONFLICT: 00099 _title = "409 CONFLICT"; 00100 _body = "<h1>409 CONFLICT</h1>"; 00101 break; 00102 00103 case HTTP_GONE: 00104 _title = "410 GONE"; 00105 _body = "<h1>410 GONE</h1>"; 00106 break; 00107 00108 case HTTP_LENGTH_REQUIRED: 00109 _title = "411 LENGTH_REQUIRED"; 00110 _body = "<h1>411 LENGTH_REQUIRED</h1>"; 00111 break; 00112 00113 case HTTP_PRECONDITION_FAILED: 00114 _title = "412 PRECONDITION_FAILED"; 00115 _body = "<h1>412 PRECONDITION_FAILED</h1>"; 00116 break; 00117 00118 case HTTP_REQUEST_ENTITY_TOO_LARGE: 00119 _title = "413 REQUEST_ENTITY_TOO_LARGE"; 00120 _body = "<h1>413 REQUEST_ENTITY_TOO_LARGE</h1>"; 00121 break; 00122 00123 case HTTP_REQUEST_URI_TOO_LONG: 00124 _title = "414 REQUEST_URI_TOO_LONG"; 00125 _body = "<h1>414 REQUEST_URI_TOO_LONG</h1>"; 00126 break; 00127 00128 case HTTP_UNSUPPORTED_MEDIA_TYPE: 00129 _title = "415 UNSUPPORTED_MEDIA_TYPE"; 00130 _body = "<h1>415 UNSUPPORTED_MEDIA_TYPE</h1>"; 00131 break; 00132 00133 case HTTP_REQUESTED_RANGE_NOT_SATISFIABLE: 00134 _title = "416 REQUESTED_RANGE_NOT_SATISFIABLE"; 00135 _body = "<h1>416 REQUESTED_RANGE_NOT_SATISFIABLE</h1>"; 00136 break; 00137 00138 case HTTP_EXPECTATION_FAILED: 00139 _title = "417 EXPECTATION_FAILED"; 00140 _body = "<h1>417 EXPECTATION_FAILED</h1>"; 00141 break; 00142 00143 case HTTP_UNPROCESSABLE_ENTITY: 00144 _title = "422 UNPROCESSABLE_ENTITY"; 00145 _body = "<h1>422 UNPROCESSABLE_ENTITY</h1>"; 00146 break; 00147 00148 case HTTP_LOCKED: 00149 _title = "423 LOCKED"; 00150 _body = "<h1>423 LOCKED</h1>"; 00151 break; 00152 00153 case HTTP_FAILED_DEPENDENCY: 00154 _title = "424 FAILED_DEPENDENCY"; 00155 _body = "<h1>424 FAILED_DEPENDENCY</h1>"; 00156 break; 00157 00158 case HTTP_UNORDERED_COLLECTION: 00159 _title = "425 UNORDERED_COLLECTION"; 00160 _body = "<h1>425 UNORDERED_COLLECTION</h1>"; 00161 break; 00162 00163 case HTTP_UPGRADE_REQUIRED: 00164 _title = "426 UPGRADE_REQUIRED"; 00165 _body = "<h1>426 UPGRADE_REQUIRED</h1>"; 00166 break; 00167 00168 case HTTP_RETRY_WITH: 00169 _title = "449 RETRY_WITH"; 00170 _body = "<h1>449 RETRY_WITH</h1>"; 00171 break; 00172 00173 00174 case HTTP_INTERNAL_SERVER_ERROR: 00175 _title = "500 INTERNAL_SERVER_ERROR"; 00176 _body = "<h1>500 INTERNAL_SERVER_ERROR</h1>"; 00177 break; 00178 00179 case HTTP_NOT_IMPLEMENTED: 00180 _title = "501 NOT_IMPLEMENTED"; 00181 _body = "<h1>501 NOT_IMPLEMENTED</h1>"; 00182 break; 00183 00184 case HTTP_BAD_GATEWAY: 00185 _title = "502 BAD_GATEWAY"; 00186 _body = "<h1>502 BAD_GATEWAY</h1>"; 00187 break; 00188 00189 case HTTP_SERVICE_UNAVAILABLE: 00190 _title = "503 SERVICE_UNAVAILABLE"; 00191 _body = "<h1>503 SERVICE_UNAVAILABLE</h1>"; 00192 break; 00193 00194 case HTTP_GATEWAY_TIMEOUT: 00195 _title = "504 GATEWAY_TIMEOUT"; 00196 _body = "<h1>504 GATEWAY_TIMEOUT</h1>"; 00197 break; 00198 00199 case HTTP_HTTP_VERSION_NOT_SUPPORTED: 00200 _title = "505 HTTP_VERSION_NOT_SUPPORTED"; 00201 _body = "<h1>505 HTTP_VERSION_NOT_SUPPORTED</h1>"; 00202 break; 00203 00204 case HTTP_VARIANT_ALSO_NEGOTIATES: 00205 _title = "506 VARIANT_ALSO_NEGOTIATES"; 00206 _body = "<h1>506 VARIANT_ALSO_NEGOTIATES</h1>"; 00207 break; 00208 00209 case HTTP_INSUFFICIENT_STORAGE: 00210 _title = "507 INSUFFICIENT_STORAGE"; 00211 _body = "<h1>507 INSUFFICIENT_STORAGE</h1>"; 00212 break; 00213 00214 case HTTP_BANDWIDTH_LIMIT_EXCEEDED: 00215 _title = "509 BANDWIDTH_LIMIT_EXCEEDED"; 00216 _body = "<h1>509 BANDWIDTH_LIMIT_EXCEEDED</h1>"; 00217 break; 00218 00219 case HTTP_NOT_EXTENDED: 00220 _title = "510 NOT_EXTENDED"; 00221 _body = "<h1>510 NOT_EXTENDED</h1>"; 00222 break; 00223 00224 default: 00225 _title = "Unknown Error"; 00226 _body = "<h1>Unknown Error</h1>"; 00227 break; 00228 } 00229 00230 if (format) { 00231 va_list args; 00232 va_start(args, format); 00233 char *tmp; 00234 if (vasprintf(&tmp, format, args) != -1) { 00235 _body += std::string("<br />\n<b>") + tmp + "</b>\n"; 00236 free(tmp); 00237 } 00238 } 00239 } 00240 00241 } // end namespace fawkes