HTTP-сервер
Протокол HTTP
Сервер, работающий по HTTP. Обычно занимает 80 tcp порт. HTTP - Hypertext transfer protocol.
Запрос и ответ представляют собой заголовки+тело.
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.ru/?gfe_rd=cr&ei=hnnWVsMb0LXoBJL6v5gM
Content-Length: 256
Date: Wed, 02 Mar 2016 05:26:30 GMT
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ru/?gfe_rd=cr&ei=hnnWVsMb0LXoBJL6v5gM">here</A>.
</BODY></HTML>
В первой строке - версия HTTP и код ответа:
200-299 - успешный код ответа
300-399 - коды перенаправления (Moved Temporary, Moved Permanently)
400-499 - ошибочные коды (404 Not Found, 403 Forbidden, 405…)
(неверный запрос с нашей стороны)
500-599 - ошибка сервера
Content-type - тип содержимого, всегда должен быть правильный.
Типы запросов HTTP
GET - запрос на получение страницы с каким-либо адресом. POST - отправка на страницу каких-то данных, получение ответа.
GET - при простом серфинге POST - при логине
PUT, DELETE, HEAD etc - браузерами обычно не используются
Отправляем запрос вручную
telnet www.youtube.com 80
GET / HTTP/1.1
Host: www.youtube.com
## Настройка web-сервера в linux
Самый популярный веб-сервер в unix - apache httpd - старый веб-сервер из начала 90х apache - a patch - патч к httpd
sudo apt-get install apache2
/etc/apache2 - каталог с настройками апача
/etc/apache2/sites-available - список сайтов, настроенных в апаче
<VirtualHost *:80> - настраивается сайт, висящий на 80 порту на всех IP-адресах
DocumentRoot /var/www/html - домашний каталог сайта, где хранится весь html
ServerName www.example.com - сайт обслуживает www.example.com (и только его)
/etc/apache2/sites-enabled - симлинки на /etc/apache2/sites-available ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled
/etc/init.d/apache2 restart (или stop, или start)
a2ensite 000-default
Создание своего сайта
- Копируем 000-default.conf в другой файл (001-mysite.conf)
- Правим строки ServerName (www.example.com) и DocumentRoot (свой путь к html-файлам)
- Добавляем www.example.com в hosts с адресом 127.0.0.1
- Создаем путь из DocumentRoot, кладем туда index.html: ```html
Hello, world!
## CGI
Common Gateway Interface - генерация веб-страниц исполнимыми файлами
a2enmod cgi
```perl
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<h1>Hello, world</h1>";
/etc/init.d/apache2 restart
PHP
PHP - Hypertext Preprocessor sudo apt-get install php5 libapache2-mod-php5
В отличие от CGI, весь PHP-текст хранится там же, где и HTML (ибо препроцессор!)
<?php
echo "Hello, world from PHP!<br />Your ip is ".$_SERVER['REMOTE_ADDR'];
if (isset($_GET["name"]))
{
echo "<br />Your name is ". $_GET["name"];
}
?>
Пример POST-запроса
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<form action="post.php" method="POST">
Имя <input type="text" name="name" />
<br />
Пароль <input type="password" name="pass" />
<br />
<input type=submit value="Отправить" />
</form>
</body>
</html>
post.php:
<h1>Ваш логин - <?php echo $_POST["name"] ?>,
пароль <?php echo $_POST["pass"] ?></h1>
Практика
- Hello, world на CGI на bash
- Hello, world на CGI на ассемблере
- Морской бой на PHP + JS (опционально) + HTML
а) HTML + JS - рисование поля своего и противника
б) PHP - логика обработки, хранения состояния, логика противника (AI)
Дополнительно изучить: сессии
PS Решение №2
_start:
mov eax, 4; write
mov ebx, 1; stdout
mov edx, len
mov ecx, msg
int 0x80
mov ebx, 0
mov eax, 1
int 0x80
ret
msg: dw "Content-type: text/html"
dw 0x0A, 0x0A
dw "<h1>Hello, world</h1>"
dw 0x0A
len equ $-msg
nasm -f elf hello.asm
ld -melf_i386 -s -o hello hello.o
