Skip to content

Instantly share code, notes, and snippets.

@cjhanks
Created July 16, 2014 16:02
Show Gist options
  • Save cjhanks/aacceac9bb569414366a to your computer and use it in GitHub Desktop.
Save cjhanks/aacceac9bb569414366a to your computer and use it in GitHub Desktop.
Http Parser Code
#include "HttpParse.hpp"
#include <cstdint>
#include <vector>
namespace {
static constexpr size_t MaximumHeaderSize = 8 * 1024;
/// {@
template <typename _Tp>
static inline uint32_t
castedString4(const _Tp& data)
{
return (*(data + 3) << 24)
| (*(data + 2) << 16)
| (*(data + 1) << 8)
| (*(data + 0) << 0);
}
template <typename _Tp>
static inline uint64_t
castedString8(const _Tp& data)
{
return (*(data + 7) << (2 * 7))
| (*(data + 6) << (2 * 6))
| (*(data + 5) << (2 * 5))
| (*(data + 4) << (2 * 4))
| (*(data + 3) << (2 * 3))
| (*(data + 2) << (2 * 2))
| (*(data + 1) << (2 * 1))
| (*(data + 0) << (2 * 0));
}
template <typename _Tp>
static constexpr uint32_t
exprString4(const _Tp& data)
{
static_assert(sizeof(data) == 4 + 1, "Non-terminated expression");
return (*(data + 3) << 24)
| (*(data + 2) << 16)
| (*(data + 1) << 8)
| (*(data + 0) << 0);
}
template <typename _Tp>
static constexpr uint64_t
exprString8(const _Tp& data)
{
static_assert(sizeof(data) == 8 + 1, "Non-terminated expression");
return (*(data + 7) << (2 * 7))
| (*(data + 6) << (2 * 6))
| (*(data + 5) << (2 * 5))
| (*(data + 4) << (2 * 4))
| (*(data + 3) << (2 * 3))
| (*(data + 2) << (2 * 2))
| (*(data + 1) << (2 * 1))
| (*(data + 0) << (2 * 0));
}
/// @}
enum HTTP_Version {
HTTP_UNDEFINED = 0,
HTTP_1_0 = exprString8("HTTP/1.0"),
HTTP_1_1 = exprString8("HTTP/1.1"),
};
enum DateSpecification {
DATE_UNDEFINED = 0,
RFC_822,
RFC_850,
ANSI_C,
};
template <typename _Tp>
DateSpecification
dateSpecification(const _Tp& data)
{
switch (castedString4(data)) {
case exprString4("Sun,"):
case exprString4("Mon,"):
case exprString4("Tue,"):
case exprString4("Wed,"):
case exprString4("Thu,"):
case exprString4("Fri,"):
case exprString4("Sat,"):
return DateSpecification::RFC_822;
case exprString4("Sund"):
case exprString4("Mond"):
case exprString4("Tues"):
case exprString4("Wedn"):
case exprString4("Thur"):
case exprString4("Frid"):
case exprString4("Satu"):
return DateSpecification::RFC_850;
case exprString4("Sun "):
case exprString4("Mon "):
case exprString4("Tue "):
case exprString4("Wed "):
case exprString4("Thu "):
case exprString4("Fri "):
case exprString4("Sat "):
return DateSpecification::ANSI_C;
default:
return DateSpecification::DATE_UNDEFINED;
}
__builtin_unreachable();
}
} // ns
HttpRequest
HttpRequest::FromSocket(int sock)
{
uint8_t* head = new uint8_t[MaximumHeaderSize];
uint8_t* tail = head;
__m128i cr = _mm_set1_epi8('\r');
__m128i lf = _mm_set1_epi8('\n');
memset(head, '\0', MaximumHeaderSize);
while (true) {
ssize_t offset = read(sock,
tail,
MaximumHeaderSize - (tail - head));
if (offset < 0) {
assert(1 == 0);
} else {
tail += offset;
}
__m128i pt = _mm_load_si128((__m128i*)
}
}
#ifndef __HTTP_PARSE_HPP
#define __HTTP_PARSE_HPP
class HttpRequest {
public:
static HttpRequest FromSocket(int sock);
};
#endif //__HTTP_PARSE_HPP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment