/* * Spdylay - SPDY Library * * Copyright (c) 2012 Tatsuhiro Tsujikawa * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "shrpx_http.h" #include #include "shrpx_config.h" #include "util.h" #include "uri.h" using namespace spdylay; namespace shrpx { namespace http { const char* get_status_string(int status_code) { switch(status_code) { case 100: return "100 Continue"; case 101: return "101 Switching Protocols"; case 200: return "200 OK"; case 201: return "201 Created"; case 202: return "202 Accepted"; case 203: return "203 Non-Authoritative Information"; case 204: return "204 No Content"; case 205: return "205 Reset Content"; case 206: return "206 Partial Content"; case 300: return "300 Multiple Choices"; case 301: return "301 Moved Permanently"; case 302: return "302 Found"; case 303: return "303 See Other"; case 304: return "304 Not Modified"; case 305: return "305 Use Proxy"; // case 306: return "306 (Unused)"; case 307: return "307 Temporary Redirect"; case 400: return "400 Bad Request"; case 401: return "401 Unauthorized"; case 402: return "402 Payment Required"; case 403: return "403 Forbidden"; case 404: return "404 Not Found"; case 405: return "405 Method Not Allowed"; case 406: return "406 Not Acceptable"; case 407: return "407 Proxy Authentication Required"; case 408: return "408 Request Timeout"; case 409: return "409 Conflict"; case 410: return "410 Gone"; case 411: return "411 Length Required"; case 412: return "412 Precondition Failed"; case 413: return "413 Request Entity Too Large"; case 414: return "414 Request-URI Too Long"; case 415: return "415 Unsupported Media Type"; case 416: return "416 Requested Range Not Satisfiable"; case 417: return "417 Expectation Failed"; case 500: return "500 Internal Server Error"; case 501: return "501 Not Implemented"; case 502: return "502 Bad Gateway"; case 503: return "503 Service Unavailable"; case 504: return "504 Gateway Timeout"; case 505: return "505 HTTP Version Not Supported"; default: return ""; } } std::string create_error_html(int status_code) { std::stringstream ss; const char *status = http::get_status_string(status_code); ss << "" << status << "" << "

" << status << "

" << "
" << "
" << get_config()->server_name << " at port " << get_config()->port << "
" << "\n"; return ss.str(); } std::string create_via_header_value(int major, int minor) { std::string hdrs; hdrs += static_cast(major+'0'); hdrs += "."; hdrs += static_cast(minor+'0'); hdrs += " shrpx"; return hdrs; } std::string modify_location_header_value(const std::string& uri) { std::string norm_uri = uri; if(util::istartsWith(uri.c_str(), "//")) { norm_uri.insert(0, "http:"); } else if(!util::istartsWith(uri.c_str(), "http://")) { return uri; } uri::UriStruct us; if(uri::parse(us, norm_uri)) { if(util::strieq(us.host.c_str(), get_config()->downstream_host) && us.port == get_config()->downstream_port) { us.protocol = "https"; us.host = get_config()->host; us.port = get_config()->port; return uri::construct(us); } } return uri; } void capitalize(std::string& s, size_t offset) { s[offset] = util::upcase(s[offset]); for(size_t i = offset+1, eoi = s.size(); i < eoi; ++i) { if(s[i-1] == '-') { s[i] = util::upcase(s[i]); } else { s[i] = util::lowcase(s[i]); } } } } // namespace http } // namespace shrpx