Переполнение стека HTTP-сервера при входе

Я пытаюсь создать простой сервер http в C ++, чья домашняя страница (в HTML):

<!DOCTYPE html>
<html>
<head>
<title>home.html</title>
</head>
<body>
<form name="input" action="login.html" method="get">
user name: <input type="text" name="user"><br>
password: <input type="text" name="password">
<input type="submit" value="Submit">
</form>
</body>
</html>

Когда пользователь нажимает кнопку «Отправить» после заполнения поля «Имя пользователя и пароль», должна появиться следующая страница:

<!DOCTYPE html>
<html>
<head>
<title>Contact info</title>
</head>
<body>
<h1>User: games</h1>
<h1>Password: bond</h1>
</body>
</html>

Я использую tcpsocket и код, который обрабатывает соединение:

tcp->listenAndAccept();
tcp->send(url.data(), url.length());

char buffer[1000];
tcp->recv(buffer, 1000);
cout << buffer;
tcp->recv(buffer, 1000);
cout << buffer;

Основной код:

int main() {
HTTPServer server(6060);
server.start();
while(true) {
string msg;
cin >> msg;
if (msg == "x") {
break;
}
}
server.kill();
return 0;
}

И конструктор это:

HTTPServer::HTTPServer(int port) {
url = "HTTP/1.1 302 Found \r\nContent-Type: text/html; charset=utf8 \r\nContent-Length:279\r\n\r\n<!DOCTYPE html><html><head><title>Creating an HTML Element</title></head><body><form name=\"input\" action=\"login.html\" method=\"get\">user name: <input type=\"text\" name=\"user\"><br>password: <input type=\"text\" name=\"password\"><input type=\"submit\" value=\"Submit\"></form></body></html>";

tcp = new TCPSocket(port);
}

Теперь, когда я вхожу 127.0.0.1:port он показывает мне домашнюю страницу и печатает ответ на консоль, но когда я заполняю поля и нажимаю кнопку отправки, ничего не происходит; второй recv ничего не получает Почему второй recv позвонить не получая ничего?

1

Решение

Браузеры используют «? Key = value»&key2 = value2 «, чтобы установить конкретное значение на веб-странице. Для поддержки формы вашему серверу необходимо проверить наличие знака вопросительного знака. Хороший способ сделать это — использовать шаблон (при условии, что он многострочный).

^GET /?(.*+)(\?(.*))? HTTP/1.[01]$

Это регулярное выражение будет иметь одну или три группы. Первый — это фактический запрос, который был сделан (игнорируя косую черту, предшествующую ему). Второе — просто сказать мачтеру, чтобы он совпадал со всей группой один раз или ноль раз. Последняя группа — переменные.

GET /index.html?user=MyUserName HTTP/1.1

При использовании регулярного выражения в HTTP-запросе выше, мы бы захватили следующие группы.

Group 1 = "index.html"Group 2 = "?user=MyUserName"Group 3 = "user=MyUserName"

При нажатии кнопки «Отправить» ваша форма автоматически перенаправляет вас на страницу «login.html». Добавление «method =» get «» не требуется, поскольку по умолчанию используется метод GET.

Данные, полученные из средства сопоставления регулярных выражений, должны обрабатываться сервером напрямую. Если данные верны, вы можете заставить сервер отправлять клиенту cookie-файл, содержащий действительный идентификатор сеанса, и отображать зарегистрированную веб-страницу, в противном случае вы можете немного изменить текущую веб-страницу.

Удачи!


Примечание. Возможно, вы захотите установить тип ввода поля пароля равным «пароль».

Примечание 2: имя вашей формы не меняется что-нибудь. Но если вы хотите изменить его с помощью CSS, замените «name =» на «class =», которое будет .input в CSS, или замените его на «id =», что сделает его #input в вашем CSS.


Не стесняйтесь поправлять меня, если я допустил ошибку.

Изменить: изменится ли URL в адресной строке браузера, если вы нажмете кнопку отправки?

Редактировать 2: Когда это код успеха, используйте код от (включительно) 200 до 299.

1

Другие решения


По вопросам рекламы [email protected]