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&amp;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

Создание своего сайта

  1. Копируем 000-default.conf в другой файл (001-mysite.conf)
  2. Правим строки ServerName (www.example.com) и DocumentRoot (свой путь к html-файлам)
  3. Добавляем www.example.com в hosts с адресом 127.0.0.1
  4. Создаем путь из 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>

Практика

  1. Hello, world на CGI на bash
  2. Hello, world на CGI на ассемблере
  3. Морской бой на 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
Written on March 2, 2016