winix/winixd/core/header.h

181 lines
6.0 KiB
C++

/*
* This file is a part of Winix
* and is distributed under the 2-Clause BSD licence.
* Author: Tomasz Sowa <t.sowa@ttmath.org>
*/
/*
* Copyright (c) 2021-2022, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef headerfile_winix_core_header
#define headerfile_winix_core_header
#include "log.h"
#include <textstream/textstream.h>
namespace Winix
{
class Header
{
public:
/*
* headers' names
*/
static constexpr const wchar_t * content_type = L"Content-Type";
static constexpr const wchar_t * accept = L"Accept";
static constexpr const wchar_t * accept_language = L"Accept-Language";
/*
* headers' names lower case
*/
static constexpr const wchar_t * content_type_lc = L"content-type";
static constexpr const wchar_t * accept_lc = L"accept";
static constexpr const wchar_t * accept_language_lc = L"accept-language";
/*
* headers' values
*/
static constexpr const wchar_t * application_octet_stream = L"application/octet-stream";
static constexpr const wchar_t * text_html = L"text/html";
static constexpr const wchar_t * application_json = L"application/json";
static constexpr const wchar_t * application_xml = L"application/xml";
static constexpr const wchar_t * application_xhtml_xml = L"application/xhtml+xml";
static constexpr const wchar_t * text_csv = L"text/csv";
static constexpr const wchar_t * text_javascript = L"text/javascript";
static constexpr const wchar_t * all_all = L"*/*";
static constexpr const wchar_t * text_all = L"text/*";
static constexpr const wchar_t * application_all = L"application/*";
static constexpr const wchar_t * text_html_utf8 = L"text/html; charset=UTF-8";
static constexpr const wchar_t * application_json_utf8 = L"application/json; charset=UTF-8";
static constexpr const wchar_t * application_xml_utf8 = L"application/xml; charset=UTF-8";
static constexpr const wchar_t * application_xhtml_xml_utf8 = L"application/xhtml+xml; charset=UTF-8";
static constexpr const wchar_t * text_csv_utf8 = L"text/csv; charset=UTF-8";
static constexpr const wchar_t * text_javascript_utf8 = L"text/javascript; charset=UTF-8";
static const int status_200_ok = 200;
static const int status_300_multiple_choices = 300;
static const int status_301_moved_permanently = 301;
static const int status_302_found = 302;
static const int status_303_see_other = 303;
static const int status_307_temporary_redirect = 307;
static const int status_400_bad_request = 400;
static const int status_403_forbidden = 403;
static const int status_404_not_found = 404;
static const int status_414_uri_too_long = 414;
static const int status_500_internal_server_error = 500;
static constexpr const wchar_t * str_status_200 = L"OK";
static constexpr const wchar_t * str_status_300 = L"Multiple Choices";
static constexpr const wchar_t * str_status_301 = L"Moved Permanently";
static constexpr const wchar_t * str_status_302 = L"Found";
static constexpr const wchar_t * str_status_303 = L"See Other";
static constexpr const wchar_t * str_status_307 = L"Temporary Redirect";
static constexpr const wchar_t * str_status_400 = L"Bad Request";
static constexpr const wchar_t * str_status_403 = L"Forbidden";
static constexpr const wchar_t * str_status_404 = L"Not Found";
static constexpr const wchar_t * str_status_414 = L"URI Too Long";
static constexpr const wchar_t * str_status_500 = L"Internal Server Error";
static const wchar_t * find_status_string_value(int http_status);
static void prepare_status_value(int http_status, pt::WTextStream & value, bool clear_value = true);
protected:
struct StatusIntStringMapHelper
{
int status_int;
const wchar_t * status_str;
};
static constexpr StatusIntStringMapHelper status_int_string_map[] = {
{status_200_ok, str_status_200},
{status_300_multiple_choices, str_status_300},
{status_301_moved_permanently, str_status_301},
{status_302_found, str_status_302},
{status_303_see_other, str_status_303},
{status_307_temporary_redirect, str_status_307},
{status_400_bad_request, str_status_400},
{status_403_forbidden, str_status_403},
{status_404_not_found, str_status_404},
{status_414_uri_too_long, str_status_414},
{status_500_internal_server_error, str_status_500},
};
};
class HeaderValue
{
public:
std::wstring value;
double weight; // q parameter in some headers
HeaderValue()
{
weight = 0.0;
}
static void log_values(const std::vector<HeaderValue> & header_values, Log & log)
{
char buf[64];
bool is_first = true;
for(const HeaderValue & h: header_values)
{
snprintf(buf, sizeof(buf)/sizeof(char), "%.3f", h.weight);
if( !is_first )
log << ", ";
log << h.value << ";q=" << buf;
is_first = false;
}
}
};
}
#endif