Http protocol implementation for the taskrambler framework.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

225 lines
10 KiB

/**
* \file
*
* \author Georg Hopp
*
* \copyright
* Copyright © 2014 Georg Hopp
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __TR_PROTOCOL_HTTP_HEADER_H__
#define __TR_PROTOCOL_HTTP_HEADER_H__
/**
* Keys for known headers index.
* =============================
*/
/**
* GENERAL-HEADER
*/
#define TR_HTTP_CACHE_CONTROL 0x00
#define TR_HTTP_CONNECTION 0x01
#define TR_HTTP_DATE 0x02
#define TR_HTTP_PRAGMA 0x03
#define TR_HTTP_TRAILER 0x04
#define TR_HTTP_TRANSFER_ENCODING 0x05
#define TR_HTTP_UPGRADE 0x06
#define TR_HTTP_VIA 0x07
#define TR_HTTP_WARNING 0x08
/**
* ENTITY-HEADER
*/
#define TR_HTTP_ALLOW 0x09
#define TR_HTTP_CONTENT_ENCODING 0x0a
#define TR_HTTP_CONTENT_LANGUAGE 0x0b
#define TR_HTTP_CONTENT_LENGTH 0x0c
#define TR_HTTP_CONTENT_LOCATION 0x0d
#define TR_HTTP_CONTENT_MD5 0x0e
#define TR_HTTP_CONTENT_RANGE 0x0f
#define TR_HTTP_CONTENT_TYPE 0x10
#define TR_HTTP_EXPIRES 0x11
#define TR_HTTP_LAST_MODIFIED 0x12
#define TR_HTTP_EXTENSION_HEADER 0x13
/**
* REQUEST-HEADER
*/
#define TR_HTTP_ACCEPT 0x14
#define TR_HTTP_ACCEPT_CHARSET 0x15
#define TR_HTTP_ACCEPT_ENCODING 0x16
#define TR_HTTP_ACCEPT_LANGUAGE 0x17
#define TR_HTTP_AUTHORIZATION 0x18
#define TR_HTTP_EXPECT 0x19
#define TR_HTTP_FROM 0x1a
#define TR_HTTP_HOST 0x1b
#define TR_HTTP_IF_MATCH 0x1c
#define TR_HTTP_IF_MODIFIED_SINCE 0x1d
#define TR_HTTP_IF_NONE_MATCH 0x1e
#define TR_HTTP_IF_RANGE 0x1f
#define TR_HTTP_IF_UNMODIFIED_SINCE 0x20
#define TR_HTTP_MAX_FORWARDS 0x21
#define TR_HTTP_PROXY_AUTHORIZATION 0x22
#define TR_HTTP_RANGE 0x23
#define TR_HTTP_REFERER 0x34
#define TR_HTTP_TE 0x35
#define TR_HTTP_USER_AGENT 0x36
/**
* RESPONSE-HEADER
*/
#define TR_HTTP_ACCEPT_RANGES 0x37
#define TR_HTTP_AGE 0x38
#define TR_HTTP_ETAG 0x39
#define TR_HTTP_LOCATION 0x3a
#define TR_HTTP_PROXY_AUTHENTICATE 0x3b
#define TR_HTTP_RETRY_AFTER 0x3c
#define TR_HTTP_SERVER 0x3d
#define TR_HTTP_VARY 0x3e
#define TR_HTTP_WWW_AUTHENTICATE 0x3f
/**
* Hashes of known headers.
* ========================
*/
#define TR_HTTP_CACHE_CONTROL_HASH 0x10ebed1ca8c23b92
#define TR_HTTP_CONNECTION_HASH 0xdf36a16b81e885be
#define TR_HTTP_DATE_HASH 0x644a475ce1876e
#define TR_HTTP_PRAGMA_HASH 0x55d60d17c6e74a7c
#define TR_HTTP_TRAILER_HASH 0xa0d2d161f2a6a1f3
#define TR_HTTP_TRANSFER_ENCODING_HASH 0x77560878338b21b5
#define TR_HTTP_UPGRADE_HASH 0xcd68a236d154b3dc
#define TR_HTTP_VIA_HASH 0x763a843fae
#define TR_HTTP_WARNING_HASH 0x7a6ff0ee66182ebc
#define TR_HTTP_ALLOW_HASH 0x600b954a930db629
#define TR_HTTP_CONTENT_ENCODING_HASH 0x255bb87d2a28e067
#define TR_HTTP_CONTENT_LANGUAGE_HASH 0xf5d09db2a6f834ac
#define TR_HTTP_CONTENT_LENGTH_HASH 0xd1087ddaa397adba
#define TR_HTTP_CONTENT_LOCATION_HASH 0x5afce14ea7508549
#define TR_HTTP_CONTENT_MD5_HASH 0x494a50455baa33ea
#define TR_HTTP_CONTENT_RANGE_HASH 0x2bdea46d9b7cd529
#define TR_HTTP_CONTENT_TYPE_HASH 0x599621fd130ed04e
#define TR_HTTP_EXPIRES_HASH 0xdf910203e8faddf4
#define TR_HTTP_LAST_MODIFIED_HASH 0xfa560d925c994000
#define TR_HTTP_EXTENSION_HEADER_HASH 0x53941c8ea8a1e7db
#define TR_HTTP_ACCEPT_HASH 0x2f3c03f7db888a08
#define TR_HTTP_ACCEPT_CHARSET_HASH 0xb37d0a6b711f7ac7
#define TR_HTTP_ACCEPT_ENCODING_HASH 0x4726b8f7454ad8b8
#define TR_HTTP_ACCEPT_LANGUAGE_HASH 0x179b9e2cc21a2cfd
#define TR_HTTP_AUTHORIZATION_HASH 0x4532c2919a3fd8b9
#define TR_HTTP_EXPECT_HASH 0xb0bd60f223697099
#define TR_HTTP_FROM_HASH 0x664bd2c2492f4a
#define TR_HTTP_HOST_HASH 0x684d4a1de0a348
#define TR_HTTP_IF_MATCH_HASH 0x41d2aaf0e365b1d5
#define TR_HTTP_IF_MODIFIED_SINCE_HASH 0xf274d261b51c4346
#define TR_HTTP_IF_NONE_MATCH_HASH 0xf9944adc1db092c0
#define TR_HTTP_IF_RANGE_HASH 0x46c07c55341330cd
#define TR_HTTP_IF_UNMODIFIED_SINCE_HASH 0x5168b51c08ddb0ff
#define TR_HTTP_MAX_FORWARDS_HASH 0x1a77424bd2be9957
#define TR_HTTP_PROXY_AUTHORIZATION_HASH 0x70e31fa0e6a3863a
#define TR_HTTP_RANGE_HASH 0x70c2bb9516e929fd
#define TR_HTTP_REFERER_HASH 0xa4479c0c286c9cd
#define TR_HTTP_TE_HASH 0x741cf1
#define TR_HTTP_USER_AGENT_HASH 0x7b0fac82315c4c3
#define TR_HTTP_ACCEPT_RANGES_HASH 0xbed0ffaee7c0c65b
#define TR_HTTP_AGE_HASH 0x61302af99f
#define TR_HTTP_ETAG_HASH 0x654b1794b07a15
#define TR_HTTP_LOCATION_HASH 0xbea0ee8241080f75
#define TR_HTTP_PROXY_AUTHENTICATE_HASH 0xe8909f18b6b8f7f4
#define TR_HTTP_RETRY_AFTER_HASH 0x1481da5b8cb48417
#define TR_HTTP_SERVER_HASH 0x1aa6e41ab4ba5e83
#define TR_HTTP_VARY_HASH 0x765794a25a3472
#define TR_HTTP_WWW_AUTHENTICATE_HASH 0x71324edcfda58eeb
#define TR_HTTP_CLOSE_HASH 0x62044f781c64a398
#define TR_HTTP_KEEP_ALIVE_HASH 0xef5fed49e89640e5
/**
* Big ternery to map hashes to keys of knwon headers.
* ===================================================
*/
#define TR_IDX_BY_HASH(hash) ( \
(hash) == TR_HTTP_CACHE_CONTROL_HASH ? TR_HTTP_CACHE_CONTROL : \
(hash) == TR_HTTP_CONNECTION_HASH ? TR_HTTP_CONNECTION : \
(hash) == TR_HTTP_DATE_HASH ? TR_HTTP_DATE : \
(hash) == TR_HTTP_PRAGMA_HASH ? TR_HTTP_PRAGMA : \
(hash) == TR_HTTP_TRAILER_HASH ? TR_HTTP_TRAILER : \
(hash) == TR_HTTP_TRANSFER_ENCODING_HASH ? TR_HTTP_TRANSFER_ENCODING : \
(hash) == TR_HTTP_UPGRADE_HASH ? TR_HTTP_UPGRADE : \
(hash) == TR_HTTP_VIA_HASH ? TR_HTTP_VIA : \
(hash) == TR_HTTP_WARNING_HASH ? TR_HTTP_WARNING : \
(hash) == TR_HTTP_ALLOW_HASH ? TR_HTTP_ALLOW : \
(hash) == TR_HTTP_CONTENT_ENCODING_HASH ? TR_HTTP_CONTENT_ENCODING : \
(hash) == TR_HTTP_CONTENT_LANGUAGE_HASH ? TR_HTTP_CONTENT_LANGUAGE : \
(hash) == TR_HTTP_CONTENT_LENGTH_HASH ? TR_HTTP_CONTENT_LENGTH : \
(hash) == TR_HTTP_CONTENT_LOCATION_HASH ? TR_HTTP_CONTENT_LOCATION : \
(hash) == TR_HTTP_CONTENT_MD5_HASH ? TR_HTTP_CONTENT_MD5 : \
(hash) == TR_HTTP_CONTENT_RANGE_HASH ? TR_HTTP_CONTENT_RANGE : \
(hash) == TR_HTTP_CONTENT_TYPE_HASH ? TR_HTTP_CONTENT_TYPE : \
(hash) == TR_HTTP_EXPIRES_HASH ? TR_HTTP_EXPIRES : \
(hash) == TR_HTTP_LAST_MODIFIED_HASH ? TR_HTTP_LAST_MODIFIED : \
(hash) == TR_HTTP_EXTENSION_HEADER_HASH ? TR_HTTP_EXTENSION_HEADER : \
(hash) == TR_HTTP_ACCEPT_HASH ? TR_HTTP_ACCEPT : \
(hash) == TR_HTTP_ACCEPT_CHARSET_HASH ? TR_HTTP_ACCEPT_CHARSET : \
(hash) == TR_HTTP_ACCEPT_ENCODING_HASH ? TR_HTTP_ACCEPT_ENCODING : \
(hash) == TR_HTTP_ACCEPT_LANGUAGE_HASH ? TR_HTTP_ACCEPT_LANGUAGE : \
(hash) == TR_HTTP_AUTHORIZATION_HASH ? TR_HTTP_AUTHORIZATION : \
(hash) == TR_HTTP_EXPECT_HASH ? TR_HTTP_EXPECT : \
(hash) == TR_HTTP_FROM_HASH ? TR_HTTP_FROM : \
(hash) == TR_HTTP_HOST_HASH ? TR_HTTP_HOST : \
(hash) == TR_HTTP_IF_MATCH_HASH ? TR_HTTP_IF_MATCH : \
(hash) == TR_HTTP_IF_MODIFIED_SINCE_HASH ? TR_HTTP_IF_MODIFIED_SINCE : \
(hash) == TR_HTTP_IF_NONE_MATCH_HASH ? TR_HTTP_IF_NONE_MATCH : \
(hash) == TR_HTTP_IF_RANGE_HASH ? TR_HTTP_IF_RANGE : \
(hash) == TR_HTTP_IF_UNMODIFIED_SINCE_HASH ? TR_HTTP_IF_UNMODIFIED_SINCE : \
(hash) == TR_HTTP_MAX_FORWARDS_HASH ? TR_HTTP_MAX_FORWARDS : \
(hash) == TR_HTTP_PROXY_AUTHORIZATION_HASH ? TR_HTTP_PROXY_AUTHORIZATION : \
(hash) == TR_HTTP_RANGE_HASH ? TR_HTTP_RANGE : \
(hash) == TR_HTTP_REFERER_HASH ? TR_HTTP_REFERER : \
(hash) == TR_HTTP_TE_HASH ? TR_HTTP_TE : \
(hash) == TR_HTTP_USER_AGENT_HASH ? TR_HTTP_USER_AGENT : \
(hash) == TR_HTTP_ACCEPT_RANGES_HASH ? TR_HTTP_ACCEPT_RANGES : \
(hash) == TR_HTTP_AGE_HASH ? TR_HTTP_AGE : \
(hash) == TR_HTTP_ETAG_HASH ? TR_HTTP_ETAG : \
(hash) == TR_HTTP_LOCATION_HASH ? TR_HTTP_LOCATION : \
(hash) == TR_HTTP_PROXY_AUTHENTICATE_HASH ? TR_HTTP_PROXY_AUTHENTICATE : \
(hash) == TR_HTTP_RETRY_AFTER_HASH ? TR_HTTP_RETRY_AFTER : \
(hash) == TR_HTTP_SERVER_HASH ? TR_HTTP_SERVER : \
(hash) == TR_HTTP_VARY_HASH ? TR_HTTP_VARY : \
(hash) == TR_HTTP_WWW_AUTHENTICATE_HASH ? TR_HTTP_WWW_AUTHENTICATE : -1)
#define TR_N_HTTP_HEADER_IDX 0x40
extern const char* const TR_http_header_keys[];
extern const unsigned long TR_http_header_hashes[];
#include "trbase.h"
#include "trdata.h"
TR_CLASS(TR_HttpHeader) {
unsigned long hash;
int idx;
const char * key;
TR_Queue value;
};
TR_INSTANCE_INIT(TR_HttpHeader);
TR_CLASSVARS_DECL(TR_HttpHeader) {};
int _httpHeaderCompare(const void *, const void *);
#endif // __TR_PROTOCOL_HTTP_HEADER_H__
// vim: set ts=4 sw=4: