Мне было дано задание, которое включает в себя написание веб-сервера с использованием c ++ и библиотеки Boost Asio.
Я собрал рабочий сервер, который может отправлять html файлы обратно в браузер клиента с помощью книги называется "Boost.Asio C ++ Network Programming Cookbook", но я борюсь с обработкой запросов POST от клиента.
Когда клиент подключается к серверу, ему предоставляется простая форма HTML, состоящая из поля имени пользователя и пароля для входа на сервер, которая затем отправляется на сервер с помощью запроса POST.
Я вывел содержимое полученного POST-запроса на консоль, и я могу видеть всю информацию заголовка, но не могу увидеть данные формы. Я использовал Wireshark для проверки пакетов, и данные отправляются по сети.
Данные принимаются сервером в виде потокового буфера Boost Asio, и я анализирую его, чтобы получить запрошенный файл HTML читая его в векторе, а затем беря соответствующие элементы, такие как метод или цель.
Есть ли у кого-нибудь какие-либо предложения относительно того, где искать учебники о том, как анализировать данные формы?
Приведенный ниже код является частью файла cpp, который анализирует запрос POST и обрабатывает ответ на основе содержимого запроса. параметр '& request' - Boost Asio streambuf
У меня очень мало опыта в веб-программировании, и я был бы благодарен за любые советы!
Код для разбора запросов
// Prepare and return the response message.
// Parse the request from the client to find requested document
std::istream buffer(&request);
std::vector<std::string> parsed((std::istream_iterator<std::string>(buffer)), std::istream_iterator<std::string>() );
Обработка POST-запросов
else if (parsed.size() >= 3 && parsed[0] == "POST") {
htmlFile = "/files.html";
// Retrieve files from server file system. The second element in 'parsed' vector is file name
std::ifstream fileStream(".\\directory" + htmlFile);
// If the file exists then iterate it and assign the value to the content string variable, else return 404.
if (fileStream.good()) {
std::string fileContents((std::istreambuf_iterator<char>(fileStream)), std::istreambuf_iterator<char>());
content = fileContents;
code = "200 ok";
}
else {
std::ifstream fileStream(".\\directory\\404.html");
std::string fileContents((std::istreambuf_iterator<char>(fileStream)), std::istreambuf_iterator<char>());
content = fileContents;
code = "404";
}// End of nested if-else statement
}// End of else-if statement
else {
std::ifstream fileStream(".\\directory\\401.html");
std::string fileContents((std::istreambuf_iterator<char>(fileStream)), std::istreambuf_iterator<char>());
content = fileContents;
code = "401";
// Write bad request to log file for security audits if not "GET" request
logging.logAction("Illegal request by client IP " + m_sock->remote_endpoint().address().to_string());
}//End of if-else statement
std::ostringstream oss;
oss << "GET HTTP/1.1 " << code << " \r\n";
oss << "Cache-Control: no-cache, private" << "\r\n";
oss << "Content-Type: text/html" << "\r\n";
oss << "Content-Length: " << content.size() << "\r\n";
oss << "\r\n\r\n";
oss << content;
response = oss.str().c_str();