python - 带有 python 套接字的 HTTP 服务器

标签 python sockets http

我编写了一个使用 HTTP 协议(protocol)与 chrome 浏览器通信的服务器代码,由于某种原因,我得到了一个异常。
异常是索引越界异常,但服务器仍然对 chrome 做出响应,我可以在屏幕上显示的 html 文件上看到答案。 (异常(exception)是在 recv 函数中 get_clients_req() )。
如果有人能解释我为什么,我会很高兴。

import socket

IP = '127.0.0.1'
PORT = 80


def get_clients_req(client):
    recv = client.recv(2 ** 16).decode()
    recv = recv.split('\n')[0].split('/')
    recv = recv[1].split(' ')[0].split('?')
    return recv[0], recv[1].split('&')


def clean_data(request, params):
    valid = False
    clean_params = []
    error_msg = 'Not Valid Request'
    if request == 'calculate-area' and len(params) == 2:
        if 'height' in params[0] and 'width' in params[1]:
            print(params[0], params[1])
            valid = True
            error_msg = 'Everything is just Fine <3<3'
            clean_params.append(params[0].replace('height=', ''))
            clean_params.append(params[1].replace('width=', ''))
            print(clean_params[0], clean_params[1])
        else:
            valid = False
            error_msg = 'Parameters are not valid'
            clean_params = []
    else:
        valid = False
        error_msg = 'Request is not valid'
        clean_params = []
    return (valid, error_msg, clean_params)


def handle_request(client, clean_params):
    area = int(clean_params[0]) * int(clean_params[1]) / 2
    data = 'HTTP/1.1 200 OK \r\n'
    data = 'HTTP/1.1 200 OK \r\n'
    data += 'Connect-Type: text/html; charset=utf-8\r\n'
    data += '\r\n'
    data += f'<html><body>{area}</body></html>\r\n\r\n'
    client.sendall(data.encode())
    client.shutdown(socket.SHUT_WR)


server = socket.socket()
server.bind((IP, PORT))
server.listen()

print(f'URL: {IP}:{PORT}')

while 1:
    client, client_add = server.accept()
    request, params = get_clients_req(client)
    (valid, error_msg, clean_params) = clean_data(request, params)
    handle_request(client, clean_params)

异常(exception):
Traceback (most recent call last):
  File "C:/Users/orlav/PycharmProjects/networks_book/chapter_4/e4.8.py", line 56, in <module>
    request, params = get_clients_req(client)
  File "C:/Users/orlav/PycharmProjects/networks_book/chapter_4/e4.8.py", line 11, in get_clients_req
    return recv[0], recv[1].split('&')
IndexError: list index out of range

最佳答案

recv = recv[1].split(' ')[0].split('?')
return recv[0], recv[1].split('&')

没有recv[1]如果没有 ?,则在最后一行在原始请求中,这会导致您看到堆栈跟踪。虽然您没有显示您打算发送的原始请求,但浏览器通常会尝试访问一些 /facicon.ico本身,此请求没有 ? .

关于python - 带有 python 套接字的 HTTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64322040/

相关文章:

python - python 3中的快速异或字节

python - 如何使用 boto3 cloudformation 资源列出和过滤堆栈?

c - 在 c 中使用套接字时,FD_SET 和 FD_ISSET 背后的数据结构是什么?

c - 错误 malloc() : memory corruption

用于套接字的 C++ 迭代器外观

python - python中json文件的加载问题

java - 如何在HTTP客户端库中返回JSON?

http - 监听随机 IP 的自定义 HTTP 服务器

java - HttpRequestBase - 如何打印请求及其所有数据

python - 用填充字符和计数器创建python字符串