Fawkes API  Fawkes Development Version
error_reply.cpp
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