Search code examples
pythontelnet

Telnet to Python server gets stuck


I am preparing a demo, and I wanted to use a simple server for it, instead of nginx or any other popular server.

I got the following one from python official page:

import SimpleHTTPServer
import SocketServer

PORT = 8000

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

So, I run it, and everything seems to be fine:

python -m SimpleHTTPServer 8000

If I go to the browser, or curl the IP address, it works just fine:

xx.xx.xx.xx - - [31/May/2019 09:36:33] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:37:43] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:37:46] "HEAD / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:03] "HEAD / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:06] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:12] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:13] "GET / HTTP/1.1" 200 -

Now, when I connect to the server through telnet, and I do GET, the server get stuck:

$ telnet xx.xx.xx.xx 8000
Trying xx.xx.xx.xx...
Connected to xx.xx.xx.xx.
Escape character is '^]'.
GET / HTTP/1.1
...It just hangs here foever...

When I hit on ctrl+c on the server, it shows me an exception that happened, that I don't know how to interpret in this context:

^C----------------------------------------
Exception happened during processing of request from ('xx.xx.xx.xx', 47346)
Traceback (most recent call last):
  File "/usr/lib/python3.5/socketserver.py", line 313, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python3.5/socketserver.py", line 341, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python3.5/socketserver.py", line 354, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.5/socketserver.py", line 681, in __init__
    self.handle()
  File "/usr/lib/python3.5/http/server.py", line 422, in handle
    self.handle_one_request()
  File "/usr/lib/python3.5/http/server.py", line 400, in handle_one_request
    if not self.parse_request():
  File "/usr/lib/python3.5/http/server.py", line 334, in parse_request
    _class=self.MessageClass)
  File "/usr/lib/python3.5/http/client.py", line 206, in parse_headers
    line = fp.readline(_MAXLINE + 1)
  File "/usr/lib/python3.5/socket.py", line 576, in readinto
    return self._sock.recv_into(b)
KeyboardInterrupt
----------------------------------------

I also SSH-ed into the same machine where the server is running and did the request connecting to the localhost. Hanged too.

I would like to know:

  1. How is telnet GET different to other GETs.
  2. At python server level, what does the exception mean, and how to solve it.

Solution

    1. How is telnet GET different to other GETs.

    telnet is not different here. Your server is hanging because it is waiting for you to finish typing your GET request. For this, you just need to press Enter twice, after typing your GET request.

    This is because:

    • One CR-LF character is required to end the message header section of the HTTP request (as specified here)
    • another one is the actual CR-LF that tells telnet you finished entering input
    1. At python server level, what does the exception mean, and how to solve it.

    This is just a consequence of you pressing Ctrl + C, thus interrupting the Python process running your SimpleHTTPServer.