- Klienti posílají data pomocí [metody POST][POST] s cestou
`/osp/myserver/data`. Data jsou ve formátu čistého textu
- (text/plain) v kódování UTF-8.
+ (text/plain) v kódování UTF-8 komprimovaného metodou [gzip][gzip].
- Server obsahuje "čítač jedinečných slov". Při spuštění serveru je
tento čítač roven 0.
- Server si vede evidenci o slovech zaslaných v jednotlivých
[HTTP]: http://tools.ietf.org/html/rfc2616
[POST]: http://tools.ietf.org/html/rfc2616#section-9.5
[GET]: http://tools.ietf.org/html/rfc2616#section-9.3
+[gzip]: https://tools.ietf.org/html/rfc1952
Příklad
-------
-Předpokládejme, že náš server běží na adrese 127.0.0.1 (t.j.
-localhost) na portu 8000. Použijeme program `curl` k posílání
+Předpokládejme, že náš server běží na lokálním počítači (t.j.
+localhost) na portu 8080. Použijeme program `curl` k posílání
požadavků serveru:
- curl 127.0.0.1:8000/osp/myserver/data --data-binary "první pokus"
- curl 127.0.0.1:8000/osp/myserver/data --data-binary "druhý pokus"
- curl 127.0.0.1:8000/osp/myserver/count --output -
+ curl localhost:8080/osp/myserver/data --data-binary @<(echo první pokus|gzip)
+ curl localhost:8080/osp/myserver/data --data-binary @<(echo druhý pokus|gzip)
+ curl localhost:8080/osp/myserver/count --output -
Výstupem posledního příkazu bude řetězec "3". Místo posledního příkazu
můžete použít i webový prohlížeč nasměrovaný na adresu
-<http://127.0.0.1:8000/osp/myserver/count>.
+<http://localhost:8000/osp/myserver/count>.
+
+*Poznámka:* Syntaxe `<(příkaz...)` je tzv. *process substitution* v
+interpreteru `bash`. Jedná se o jeden z možných způsobů předání
+binárních dat na příkazové řádce.
Výkon serveru
-------------
#!/usr/bin/python3
from http.server import HTTPServer, BaseHTTPRequestHandler
+import gzip
words = {}
global words
if self.path == "/osp/myserver/data":
length = int(self.headers.get('Content-Length'))
- text = self.rfile.read(length).decode("utf-8")
+ text = gzip.decompress(self.rfile.read(length)).decode("utf-8")
for word in text.split():
words[word] = 1;
self.send_response(204) # No Content
self.send_response(404)
self.end_headers()
-httpd = HTTPServer(('', 8000), OSPHTTPHandler)
+class HTTPServerIPv6(HTTPServer):
+ import socket
+ address_family = socket.AF_INET6
+
+# httpd = HTTPServer(('', 8080), OSPHTTPHandler) # Use if your system uses IPv4 by default
+httpd = HTTPServerIPv6(('', 8080), OSPHTTPHandler) # Use if your system uses IPv6 by default
print("Listening on port", httpd.server_port)
httpd.serve_forever()
"""]]
+Pokud se k tomuto ukázkovému serveru připojí mnoho klientů, bude
+"přetížen" a čas od času bude klienty odmítat. Takže prvním krokem
+vašeho řešení může být zjištění příčiny tohoto chování a její
+napravení.
+
Testování a měření výkonu
=========================
**Odevzdávací systém běží momentálně v testovacím provozu.** Je možné,
že naměřené hodnoty budou horší, než jaké lze z vašeho serveru
"vymáčknout".
-
-Kromě odevzdávacího systému můžete použít i program
-`osp-server-tester`, který je nainstalován školních počítačích. Pro
-testování ukázkového serveru spusťte program následovně:
-
- osp-server-tester localhost 8000
-
-Pokud testovací program spustíte následovně
-
- osp-server-tester localhost 8000 --more
-
-ukázkový server bude přetížen a čas od času bude klienty odmítat.
-Takže prvním krokem vašeho řešení může být zjištění příčiny tohoto
-chování a její napravení.