Skip to content

Instantly share code, notes, and snippets.

@reymons
Created October 25, 2020 14:49
Show Gist options
  • Save reymons/99ea47b78d2007dc992931938a47cb5b to your computer and use it in GitHub Desktop.
Save reymons/99ea47b78d2007dc992931938a47cb5b to your computer and use it in GitHub Desktop.
Сечин Данил, РИ-380014
Работа с протоколом HTTP через telnet
ЗАДАНИЕ 1.
Создать проект со следующей структурой:
myproject/
├── about
│ └── aboutme.html
└── index.html
В файле index.html написать 2 ссылки с прямым и абсолютным обращением к aboutme.html.
В файле aboutme.html создать такие же ссылки на файл index.html
1) Создаем ссылки в index.html:
<!Doctype HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<a href="/home/waffenbruder/Desktop/myproject/about/aboutme.html">About me - absolute route</a>
<br>
<a href="about/aboutme.html">About me - relative route</a>
</body>
<html>
2) Создаем ссылки в aboutme.html:
<!Doctype HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<a href="/home/waffenbruder/Desktop/myproject/index.html">Index - absolute route</a>
<br>
<a href="../index.html">Index - relative route</a>
</body>
<html>
ЗАДАНИЕ 2.
Подключиться по telnet к http://wikipedia.org и отправить запрос:
GET /wiki/страница HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
(пустая строка)
Проанализировать ответ сервера. Описать работу HTTP протокола в данном случае.
Разрешается выбрать любой другой веб-сайт вместо http://WikiPedia.org
Ответ:
1) Для работы, возьмем сайт opennet.ru.
После ввода telnet opennet.ru (доменное имя, можно ip) 80 (порт, стандарт HTTP), происходит подключение к сайту:
Trying 91.198.174.192...
Connected to opennet.ru.
Escape character is '^]'.
После чего уже отправляется сам запрос:
GET /wiki/страница HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
(пустая строка)
На выходе получаем HTML-разметку страницы, которая находится по пути opennet.ru/opennews/
В конце ответа, после его получения, соединение закрывается (Connection closed by foreign host).
ЗАДАНИЕ 3.
Отправить запросы на http://httpbin.org, проанализировать ответ и код состояния.
Описать работу HTTP протокола в каждом запросе.
1. Запросить данные GET запросом с ресурса ip
/ip
GET /ip HTTP/1.1
Host: httpbin.org
Accept: */*
Решение:
После ввода telnet httpbin.org 80, вбиваем запрос:
GET /ip HTTP/1.1
Host: httpbin.org
Accept: */*
Выходит ответ:
HTTP/1.1 200 OK
Date: Sun, 25 Oct 2020 13:19:08 GMT
Content-Type: application/json
Content-Length: 33
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"origin": "82.193.155.227"
}
Где:
1. HTTP/1.1 200 OK означает, что по всерсии HTTP 1.1 произошел успешный запрос (200 ОК);
2. Date: Sun, 25 Oct 2020 13:19:08 GMT - дата и время ответа;
3. Content-Type: application/json - передаваемый файл будет json-формата;
4. Content-Length: 33 - размер ответа. Равен 33;
5. Connection: keep-alive - keep-alive параметр означанет, что по TCP-соединению может проходить сразу несколько запросов;
6. Server: gunicorn/19.9.0 - сервер, на котором запущен сайт
7. Access-Control-Allow-Origin: * - казывает на то, что сервер разрешает кросс-доменные запросы, или какие домены могут обращаться к ресурсам сайта.
В данном случае все. Следующий заголовок указывает, что подобное разрешение необходимо.
8. После пустой строки идёт сам ответ, где отображён ip сайта, который можно получить, перейдя по пути httpbin.org/ip
2. Выполнить запрос методом GET
/get
GET /get?foo=bar&1=2&2/0&error=True HTTP/1.1
Host: httpbin.org
Accept: */*
Решение:
После ввода telnet httpbin.org 80, вбиваем запрос:
GET /get?foo=bar&1=2&2/0&error=True HTTP/1.1
Host: httpbin.org
Accept: */*
Получаем ответ:
HTTP/1.1 200 OK
Date: Sun, 25 Oct 2020 13:32:00 GMT
Content-Type: application/json
Content-Length: 323
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {
"1": "2",
"2/0": "",
"error": "True",
"foo": "bar"
},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-5f957e50-1a04b6d61cb922e24ec8a239"
},
"origin": "82.193.155.227",
"url": "http://httpbin.org/get?foo=bar&1=2&2%2F0&error=True"
}
Сервер получает параметры и значения, собирая в пары json.
3. Выполнить запрос методом POST
/post
POST /post HTTP/1.1
Host: httpbin.org
Accept: */*
Content-Length: вычислить длину контента и втавить сюда число!!!
Content-Type: application/x-www-form-urlencoded
foo=bar&1=2&2%2F0=&error=True
Попробовать ввести неверное значение Content-Length.
Решение:
Длина строки foo=bar&1=2&2%2F0=&error=True равна 29 символам
Вводя запрос, получим ответ:
HTTP/1.1 200 OK
Date: Sun, 25 Oct 2020 13:48:42 GMT
Content-Type: application/json
Content-Length: 445
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"data": "",
"files": {},
"form": {
"1": "2",
"2/0": "",
"error": "True",
"foo": "bar"
},
"headers": {
"Accept": "*/*",
"Content-Length": "29",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"X-Amzn-Trace-Id": "Root=1-5f958235-6c59042b1b9390cb32fb07a8"
},
"json": null,
"origin": "82.193.155.227",
"url": "http://httpbin.org/post"
}
Запрос прошёл успешно (200 ОК), данные записались.
Если укзать длинну меньше, чем 29, то путь обрежется по длине.
Допустим, возьмем число 5, тогда останется foo=b и ответ будет:
"args": {},
"data": "",
"files": {},
"form": {
"foo": "b"
А дальше возникает ошибка, так как серверу непонятно, что за данные мы передали после 5 символов.
HTTP/1.1 400 Bad Request
Server: awselb/2.0
Date: Sun, 25 Oct 2020 14:37:46 GMT
Content-Type: text/html
Content-Length: 122
Connection: close
4. Отправить запрос на установку Cookie
/cookies/set
GET /cookies/set?country=Ru HTTP/1.1
Host: httpbin.org
Accept: */*
Ответ:
HTTP/1.1 302 FOUND
Date: Sun, 25 Oct 2020 14:39:58 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 223
Connection: keep-alive
Server: gunicorn/19.9.0
Location: /cookies
Set-Cookie: country=Ru; Path=/
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to target URL: <a href="/cookies">/cookies</a>. If not click the link.
Код 302 означает, что запрошенный ресурс был временно перемещен по адресу, указанному в заголовке Location, где мы задали
определенные параметры, указанные в Set-Cookie.
5. Просмотреть список установленных Cookie
/cookies
GET /cookies HTTP/1.1
Host: httpbin.org
Accept: */*
Ответ:
HTTP/1.1 200 OK
Date: Sun, 25 Oct 2020 14:43:52 GMT
Content-Type: application/json
Content-Length: 20
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"cookies": {}
}
Запрос успешен, но куки не установились на прошлом шаге, возможно, дело в перенаправлении.
Например, в браузере куки сохраняются при таких же запросах.
После данно запроса, так как указан set, то нас бы перенаправило на /cookies, где был бы установлен Ru регион.
6. Отправить запрос на страницу с перенаправлением
/redirect
GET /redirect/4 HTTP/1.1
Host: httpbin.org
Accept: */*
Ответ:
HTTP/1.1 404 Not Found
Server: awselb/2.0
Date: Sun, 25 Oct 2020 14:47:38 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 0
Connection: keep-alive
Код 404 - ошибка, сервис не найден.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment