* pch = what;
49 const char* end = what +
len;
51 char* dest_end =
buf+ buf_size;
59 if(pch >= end - 1 || dest >= dest_end)
64 if(ch >=
'0'&& ch <=
'9')
66 else if(ch >=
'A'&& ch <=
'F')
67v = (ch -
'A'+ 10) * 16;
68 else if(ch >=
'a'&& ch <=
'f')
69v = (ch -
'a'+ 10) * 16;
74 if(ch >=
'0'&& ch <=
'9')
76 else if(ch >=
'A'&& ch <=
'F')
78 else if(ch >=
'a'&& ch <=
'f')
111 char*
buf=
nullptr;
118 const char* end = Data + Length;
124 boolis_name =
true;
125 boolparam_finished =
false;
129 const char* c_begin = ch;
130has_encodings =
false;
136has_encodings =
true;
144param_finished =
true;
155 if(!has_encodings) {
161prm->
m_Val=
nullptr;
164prm->
m_Val= c_begin;
175prm->
m_Val=
nullptr;
194 if(param_finished) {
195param_finished =
false;
210 if(h2o_memis(
m_Req->method.base,
m_Req->method.len,
213H2O_TOKEN_CONTENT_TYPE, -1);
218 m_Req->headers.entries[cursor].value.len))
220}
else if(h2o_memis(
m_Req->method.base,
m_Req->method.len,
225 char* begin = &
m_Req->path.base[
m_Req->query_at];
226 const char* end = &
m_Req->path.base[
m_Req->path.len];
233 const char**
value,
size_t* value_len)
257vector<string> & values)
266values.push_back(
string(
m_Params[
i].m_Val,
289 structsockaddr sock_addr;
290 if(
m_Req->conn->callbacks->get_peername(
m_Req->conn, &sock_addr) != 0) {
291 autoport =
GetPort(&sock_addr);
298 if(!peer_ip.empty()) {
312 for(
size_tindex = 0; index <
m_Req->headers.size; ++index) {
313 stringname(
m_Req->headers.entries[index].name->base,
314 m_Req->headers.entries[index].name->len);
318 m_Req->headers.entries[index].value.len);
328 size_tname_size = name.size();
330 for(
size_tindex = 0; index <
m_Req->headers.size; ++index) {
331 if(
m_Req->headers.entries[index].name->len == name_size) {
333name.data(), name_size) == 0) {
334 value.assign(
m_Req->headers.entries[index].value.base,
335 m_Req->headers.entries[index].value.len);
364optional<string> ret;
366 for(
size_tindex = 0; index <
m_Req->headers.size; ++index) {
372 m_Req->headers.entries[index].value.len));
375 if(found !=
NULL) {
398 const size_tbuf_size = 50 * 1024;
400 const char* tracking_env[
m_Req->headers.size + 1];
401unique_ptr<char[]>
buffer(
new char[buf_size]);
402 char* raw_buffer =
buffer.get();
405 for(
size_tindex = 0; index <
m_Req->headers.size; ++index) {
406 size_tname_val_size =
m_Req->headers.entries[index].name->len +
407 m_Req->headers.entries[index].value.len +
409 if(pos + name_val_size > buf_size) {
410 PSG_WARNING(
"The buffer for request headers is too small ("<<
411buf_size <<
" bytes)");
415tracking_env[index] = raw_buffer + pos;
416memcpy(raw_buffer + pos,
m_Req->headers.entries[index].name->base,
417 m_Req->headers.entries[index].name->len);
418pos +=
m_Req->headers.entries[index].name->len;
419raw_buffer[pos] =
'=';
421memcpy(raw_buffer + pos,
m_Req->headers.entries[index].value.base,
422 m_Req->headers.entries[index].value.len);
423pos +=
m_Req->headers.entries[index].value.len;
424raw_buffer[pos] =
'\0';
427tracking_env[
m_Req->headers.size] =
nullptr;
435 structsockaddr sock_addr;
436 if(
m_Req->conn->callbacks->get_peername(
m_Req->conn, &sock_addr) == 0)
446 switch(sock_addr->sa_family) {
448 if(inet_ntop(AF_INET,
449&(((
structsockaddr_in *)sock_addr)->sin_addr),
454 if(inet_ntop(AF_INET6,
455&(((
structsockaddr_in6 *)sock_addr)->sin6_addr),
467in_port_t
GetPort(
structsockaddr * sock_addr)
469 switch(sock_addr->sa_family) {
471 returnntohs(((
structsockaddr_in *)sock_addr)->sin_port);
473 returnntohs(((
structsockaddr_in6 *)sock_addr)->sin6_port);
void Parse(CHttpRequest &req, char *data, size_t length) const override
virtual bool Supports(const char *content_type, size_t content_type_len) const =0
virtual void Parse(CHttpRequest &req, char *data, size_t length) const =0
string GetHeaderValue(const string &name)
CDiagContext_Extra & PrintParams(CDiagContext_Extra &extra, bool need_peer_ip)
CQueryParam * AddParam(void)
CHttpRequestParser * m_GetParser
bool GetParam(const char *name, size_t len, const char **value, size_t *value_len)
optional< string > x_GetCookieValue(const string &cookie_name)
optional< string > GetWebCubbyUser(void)
void PrintLogFields(const CNcbiLogFields &log_fields)
TNCBI_IPv6Addr GetClientIP(void)
void GetRawBuffer(char **buf, ssize_t *len)
CHttpPostParser * m_PostParser
bool GetMultipleValuesParam(const char *name, size_t len, vector< string > &values)
optional< string > GetAdminAuthToken(void)
The NCBI C++ standard methods for dealing with std::string.
CCgiCookie * Find(const string &name, const string &domain, const string &path)
Return NULL if cannot find this exact cookie.
const string & GetValue(void) const
All "const string& GetXXX(...)" methods beneath return reference to "NcbiEmptyString" if the requeste...
CDiagContext_Extra & Print(const string &name, const string &value)
The method does not print the argument, but adds it to the string.
void LogFields(const TEntries &entries) const
Log (as an extra) all names/values matching fields in NCBI_LOG_FIELDS.
static string & ReplaceInPlace(string &src, const string &search, const string &replace, SIZE_TYPE start_pos=0, SIZE_TYPE max_replace=0, SIZE_TYPE *num_replace=0)
Replace occurrences of a substring within a string.
static string & ToLower(string &str)
Convert string to lower case â string& version.
static string kAdminAuthToken
in_port_t GetPort(struct sockaddr *sock_addr)
static string kWebCubbyUser
static string kPeerSocketIP
static string kPeerSocketPort
static bool s_HttpUrlDecode(const char *what, size_t len, char *buf, size_t buf_size, size_t *result_len)
string GetIPAddress(struct sockaddr *sock_addr)
static size_t kCookieSize
const GenericPointer< typename T::ValueType > T2 value
TNCBI_IPv6Addr NcbiGetCgiClientIPv6(ECgiClientIP flag, const char *const *tracking_env)
Same as NcbiGetCgiClientIPv6Ex(., NULL, 0, .)
@ eCgiClientIP_TryMost
Try most of known environment variables.
static PCRE2_SIZE bufsize
#define PSG_WARNING(message)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4