Telnet к серверу Python застревает - PullRequest
1 голос
/ 31 мая 2019

Я готовлю демо, и я хотел использовать для него простой сервер вместо nginx или любого другого популярного сервера.

На официальной странице python я получил следующее:

import SimpleHTTPServer
import SocketServer

PORT = 8000

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

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

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

Итак, я запускаю его, и все вроде бы нормально:

python -m SimpleHTTPServer 8000

Если я захожу в браузер или скручиваю IP-адрес, он работает просто отлично:

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 -

Теперь, когда я подключаюсь к серверу через telnet, и я делаю GET, сервер застревает:

$ 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...

Когда я нажимаю на ctrl+c на сервере, это показывает, что произошло исключение, которое я не знаю, как интерпретировать в этом контексте:

^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
----------------------------------------

Я также подключился по SSH к той же машине, где работает сервер, и выполнил запрос на подключение к локальному хосту. Повешен тоже.

Хотелось бы знать:

  1. Как telnet ПОЛУЧИТЬ отличается от других ПОЛУЧИТЬ.
  2. На уровне сервера Python, что означает исключение и как его решить.

1 Ответ

2 голосов
/ 31 мая 2019
  1. Чем Telnet GET отличается от других GET.

telnet здесь не отличается.Ваш сервер зависает, потому что он ждет, пока вы закончите вводить ваш запрос GET.Для этого вам просто нужно нажать Enter дважды, после ввода вашего запроса GET i

Это потому, что:

  • 1 символ CRLF требуется для завершения раздела заголовка сообщенияHTTP-запрос (как указано здесь )
  • , другой - фактический CRLF, который сообщает telnet, что вы закончили ввод ввода
На уровне сервера python, что означает исключение и как его решить.

Это всего лишь следствие того, что вы нажали Ctrl + C, тем самым прерывая процесс Python, выполняющий SimpleHTTPServer.

...