const char* parse_request(const char* buf, const char* buf_end, const char** method, size_t* method_len, const char** path, size_t* path_len, int* minor_version, struct phr_header* headers, size_t* num_headers, size_t max_headers, int* ret) { /* skip first empty line (some clients add CRLF after POST content) */ CHECK_EOF(); if (*buf == '\015') { ++buf; EXPECT_CHAR('\012'); } else if (*buf == '\012') { ++buf; } /* parse request line */ ADVANCE_TOKEN(*method, *method_len); ++buf; ADVANCE_TOKEN(*path, *path_len); ++buf; if ((buf = parse_http_version(buf, buf_end, minor_version, ret)) == NULL) { return NULL; } if (*buf == '\015') { ++buf; EXPECT_CHAR('\012'); } else if (*buf == '\012') { ++buf; } else { *ret = -1; return NULL; } return parse_headers(buf, buf_end, headers, num_headers, max_headers, ret); }
void FilesystemRemap::ParseMountinfo() { MyString str, str2; const char * token; FILE *fd; bool is_shared; if ((fd = fopen("/proc/self/mountinfo", "r")) == NULL) { if (errno == ENOENT) { dprintf(D_FULLDEBUG, "The /proc/self/mountinfo file does not exist; kernel support probably lacking. Will assume normal mount structure.\n"); } else { dprintf(D_ALWAYS, "Unable to open the mountinfo file (/proc/self/mountinfo). (errno=%d, %s)\n", errno, strerror(errno)); } return; } while (str2.readLine(fd, false)) { str = str2; str.Tokenize(); ADVANCE_TOKEN(token, str) // mount ID ADVANCE_TOKEN(token, str) // parent ID ADVANCE_TOKEN(token, str) // major:minor ADVANCE_TOKEN(token, str) // root ADVANCE_TOKEN(token, str) // mount point std::string mp(token); ADVANCE_TOKEN(token, str) // mount options ADVANCE_TOKEN(token, str) // optional fields is_shared = false; while (strcmp(token, "-") != 0) { is_shared = is_shared || (strncmp(token, SHARED_STR, strlen(SHARED_STR)) == 0); ADVANCE_TOKEN(token, str) } ADVANCE_TOKEN(token, str) // filesystem type if ((!is_shared) && (strcmp(token, "autofs") == 0)) { ADVANCE_TOKEN(token, str) m_mounts_autofs.push_back(pair_strings(token, mp)); } // This seems a bit too chatty - disabling for now. // dprintf(D_FULLDEBUG, "Mount: %s, shared: %d.\n", mp.c_str(), is_shared); m_mounts_shared.push_back(pair_str_bool(mp, is_shared)); } fclose(fd); }
int phr_parse_request(const char* _buf, size_t len, const char** method, size_t* method_len, const char** path, size_t* path_len, int* minor_version, struct phr_header* headers, size_t* num_headers, size_t last_len) { const char * buf = _buf, * buf_end = buf + len; size_t max_headers; /* if last_len != 0, check if the request is complete (a fast countermeasure againt slowloris */ if (last_len != 0) { int r = is_complete(buf, buf_end, last_len); if (r != 0) { return r; } } /* skip first empty line (some clients add CRLF after POST content) */ CHECK_EOF(); if (*buf == '\r') { ++buf; EXPECT('\n'); } else if (*buf == '\n') { ++buf; } /* parse request line */ *method = buf; ADVANCE_TOKEN(); *method_len = buf - *method; ++buf; *path = buf; ADVANCE_TOKEN(); *path_len = buf - *path; ++buf; EXPECT('H'); EXPECT('T'); EXPECT('T'); EXPECT('P'); EXPECT('/'); EXPECT('1'); EXPECT('.'); *minor_version = 0; for (; ; ++buf) { CHECK_EOF(); if ('0' <= *buf && *buf <= '9') { *minor_version = *minor_version * 10 + *buf - '0'; } else { break; } } if (*buf == '\r') { ++buf; EXPECT('\n'); } else if (*buf == '\n') { ++buf; } else { return -1; } /* parse headers */ max_headers = *num_headers; for (*num_headers = 0; ; ++*num_headers) { CHECK_EOF(); if (*buf == '\r') { ++buf; EXPECT('\n'); break; } else if (*buf == '\n') { ++buf; break; } if (*num_headers == max_headers) { return -1; } if (*num_headers == 0 || ! (*buf == ' ' || *buf == '\t')) { /* parsing name */ headers[*num_headers].name = buf; for (; ; ++buf) { CHECK_EOF(); if (*buf == ':') { break; } else if (*buf < ' ') { return -1; } } headers[*num_headers].name_len = buf - headers[*num_headers].name; ++buf; for (; ; ++buf) { CHECK_EOF(); if (! (*buf == ' ' || *buf == '\t')) { break; } } } else { headers[*num_headers].name = NULL; headers[*num_headers].name_len = 0; } headers[*num_headers].value = buf; for (; ; ++buf) { CHECK_EOF(); if (*buf == '\r') { headers[*num_headers].value_len = buf - headers[*num_headers].value; ++buf; EXPECT('\n'); break; } else if (*buf == '\n') { headers[*num_headers].value_len = buf - headers[*num_headers].value; ++buf; break; } } } return buf - _buf; }