<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Parandatud_joncardasise_server</id>
	<title>Parandatud joncardasise server - Redigeerimiste ajalugu</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/index.php?action=history&amp;feed=atom&amp;title=Parandatud_joncardasise_server"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Parandatud_joncardasise_server&amp;action=history"/>
	<updated>2026-10-28T17:16:10Z</updated>
	<subtitle>Selle lehekülje redigeerimiste ajalugu</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Parandatud_joncardasise_server&amp;diff=16633&amp;oldid=prev</id>
		<title>Tammet: Uus lehekülg: &#039;&lt;pre&gt; &quot;&quot;&quot; Author: Jonathan Cardasis, some fixes by T.Tammet &quot;&quot;&quot;  import socket import signal # Allow socket destruction on Ctrl+C import sys import time import threading  class W...&#039;</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Parandatud_joncardasise_server&amp;diff=16633&amp;oldid=prev"/>
		<updated>2020-02-06T07:20:04Z</updated>

		<summary type="html">&lt;p&gt;Uus lehekülg: &amp;#039;&amp;lt;pre&amp;gt; &amp;quot;&amp;quot;&amp;quot; Author: Jonathan Cardasis, some fixes by T.Tammet &amp;quot;&amp;quot;&amp;quot;  import socket import signal # Allow socket destruction on Ctrl+C import sys import time import threading  class W...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Uus lehekülg&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Author: Jonathan Cardasis, some fixes by T.Tammet&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import socket&lt;br /&gt;
import signal # Allow socket destruction on Ctrl+C&lt;br /&gt;
import sys&lt;br /&gt;
import time&lt;br /&gt;
import threading&lt;br /&gt;
&lt;br /&gt;
class WebServer(object):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Class for describing simple HTTP server objects&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, port=8080):&lt;br /&gt;
        self.host = socket.gethostname().split(&amp;#039;.&amp;#039;)[0] # Default to any avialable network interface&lt;br /&gt;
        self.port = port&lt;br /&gt;
        self.content_dir = &amp;#039;web&amp;#039; # Directory where webpage files are stored&lt;br /&gt;
&lt;br /&gt;
    def start(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Attempts to create and bind a socket to launch the server&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
&lt;br /&gt;
        try:&lt;br /&gt;
            print(&amp;quot;Starting server on {host}:{port}&amp;quot;.format(host=self.host, port=self.port))&lt;br /&gt;
            self.socket.bind((self.host, self.port))&lt;br /&gt;
            print(&amp;quot;Server started on port {port}.&amp;quot;.format(port=self.port))&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            print(&amp;quot;Error: Could not bind to port {port}&amp;quot;.format(port=self.port))&lt;br /&gt;
            self.shutdown()&lt;br /&gt;
            sys.exit(1)&lt;br /&gt;
&lt;br /&gt;
        self._listen() # Start listening for connections&lt;br /&gt;
&lt;br /&gt;
    def shutdown(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Shuts down the server&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        try:&lt;br /&gt;
            print(&amp;quot;Shutting down server&amp;quot;)&lt;br /&gt;
            s.socket.shutdown(socket.SHUT_RDWR)&lt;br /&gt;
&lt;br /&gt;
        except Exception as e:&lt;br /&gt;
            pass # Pass if socket is already closed&lt;br /&gt;
&lt;br /&gt;
    def _generate_headers(self, response_code):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Generate HTTP response headers.&lt;br /&gt;
        Parameters:&lt;br /&gt;
            - response_code: HTTP response code to add to the header. 200 and 404 supported&lt;br /&gt;
        Returns:&lt;br /&gt;
            A formatted HTTP header for the given response_code&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        header = &amp;#039;&amp;#039;&lt;br /&gt;
        if response_code == 200:&lt;br /&gt;
            header += &amp;#039;HTTP/1.1 200 OK\n&amp;#039;&lt;br /&gt;
        elif response_code == 404:&lt;br /&gt;
            header += &amp;#039;HTTP/1.1 404 Not Found\n&amp;#039;&lt;br /&gt;
&lt;br /&gt;
        time_now = time.strftime(&amp;quot;%a, %d %b %Y %H:%M:%S&amp;quot;, time.localtime())&lt;br /&gt;
        header += &amp;#039;Date: {now}\n&amp;#039;.format(now=time_now)&lt;br /&gt;
        header += &amp;#039;Server: Simple-Python-Server\n&amp;#039;&lt;br /&gt;
        header += &amp;#039;Connection: close\n\n&amp;#039; # Signal that connection will be closed after completing the request&lt;br /&gt;
        return header&lt;br /&gt;
&lt;br /&gt;
    def _listen(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Listens on self.port for any incoming connections&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.socket.listen(5)&lt;br /&gt;
        while True:&lt;br /&gt;
            (client, address) = self.socket.accept()&lt;br /&gt;
            client.settimeout(60)&lt;br /&gt;
            print(&amp;quot;Recieved connection from {addr}&amp;quot;.format(addr=address))&lt;br /&gt;
            threading.Thread(target=self._handle_client, args=(client, address)).start()&lt;br /&gt;
&lt;br /&gt;
    def _handle_client(self, client, address):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Main loop for handling connecting clients and serving files from content_dir&lt;br /&gt;
        Parameters:&lt;br /&gt;
            - client: socket client from accept()&lt;br /&gt;
            - address: socket address from accept()&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        PACKET_SIZE = 1024&lt;br /&gt;
        while True:&lt;br /&gt;
            print(&amp;quot;CLIENT&amp;quot;,client)&lt;br /&gt;
            data = client.recv(PACKET_SIZE).decode() # Recieve data packet from client and decode&lt;br /&gt;
&lt;br /&gt;
            if not data: break&lt;br /&gt;
&lt;br /&gt;
            request_method = data.split(&amp;#039; &amp;#039;)[0]&lt;br /&gt;
            print(&amp;quot;Method: {m}&amp;quot;.format(m=request_method))&lt;br /&gt;
            print(&amp;quot;Request Body: {b}&amp;quot;.format(b=data))&lt;br /&gt;
&lt;br /&gt;
            if request_method == &amp;quot;GET&amp;quot; or request_method == &amp;quot;HEAD&amp;quot;:&lt;br /&gt;
                # Ex) &amp;quot;GET /index.html&amp;quot; split on space&lt;br /&gt;
                file_requested = data.split(&amp;#039; &amp;#039;)[1]&lt;br /&gt;
&lt;br /&gt;
                # If get has parameters (&amp;#039;?&amp;#039;), ignore them&lt;br /&gt;
                file_requested =  file_requested.split(&amp;#039;?&amp;#039;)[0]&lt;br /&gt;
&lt;br /&gt;
                if file_requested == &amp;quot;/&amp;quot;:&lt;br /&gt;
                    file_requested = &amp;quot;/index.html&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                filepath_to_serve = self.content_dir + file_requested&lt;br /&gt;
                print(&amp;quot;Serving web page [{fp}]&amp;quot;.format(fp=filepath_to_serve))&lt;br /&gt;
&lt;br /&gt;
                # Load and Serve files content&lt;br /&gt;
                try:&lt;br /&gt;
                    f = open(filepath_to_serve, &amp;#039;rb&amp;#039;)&lt;br /&gt;
                    if request_method == &amp;quot;GET&amp;quot;: # Read only for GET&lt;br /&gt;
                        response_data = f.read()&lt;br /&gt;
                    f.close()&lt;br /&gt;
                    response_header = self._generate_headers(200)&lt;br /&gt;
&lt;br /&gt;
                except Exception as e:&lt;br /&gt;
                    print(&amp;quot;File not found. Serving 404 page.&amp;quot;)&lt;br /&gt;
                    response_header = self._generate_headers(404)&lt;br /&gt;
&lt;br /&gt;
                    if request_method == &amp;quot;GET&amp;quot;: # Temporary 404 Response Page&lt;br /&gt;
                        response_data = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;center&amp;gt;&amp;lt;h1&amp;gt;Error 404: File not found&amp;lt;/h1&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;p&amp;gt;Head back to dry land&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                response = response_header.encode()&lt;br /&gt;
                if request_method == &amp;quot;GET&amp;quot;:&lt;br /&gt;
                    response += response_data&lt;br /&gt;
&lt;br /&gt;
                client.send(response)&lt;br /&gt;
                client.close()&lt;br /&gt;
                break&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;Unknown HTTP request method: {method}&amp;quot;.format(method=request_method))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def shutdownServer(sig, unused):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Shutsdown server from a SIGINT recieved signal&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    server.shutdown()&lt;br /&gt;
    sys.exit(1)&lt;br /&gt;
&lt;br /&gt;
signal.signal(signal.SIGINT, shutdownServer)&lt;br /&gt;
server = WebServer(8080)&lt;br /&gt;
server.start()&lt;br /&gt;
print(&amp;quot;Press Ctrl+C to shut down server.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tammet</name></author>
	</entry>
</feed>