Python Запрос сокета GET с URL не понят в правильном формате? - PullRequest
0 голосов
/ 09 февраля 2020

Я пытаюсь настроить http-запрос на назначение для подключения к веб-серверу и подсчитать, сколько раз данное слово встречается на странице. Я работаю над первой половиной этого, и каждый раз, когда я пытаюсь отправить запрос на информацию заголовка с последней измененной датой, он возвращает ошибку 400 неверных запросов

import socket,sys 

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('162.246.156.195', 80)
client_socket.connect(server_address)

request = ''' GET / tests/a.html HTTP/1.1
HOST: 162.246.156.195
IF-MODIFIED-SINCE: <>
Conncection: keep-alive

''';
client_socket.send(request.encode())
mod_request = client_socket.recv(2048).decode()
print(mod_request)
client_socket.close()

это то, что я получаю,

HTTP/1.1 400 Bad Request
Date: Sat, 08 Feb 2020 20:53:36 GMT
Server: Apache/2.4.29 (Ubuntu)
Content-Length: 328
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.4.29 (Ubuntu) Server at 2605:fd00:4:1000:f816:3eff:fe1e:9b1a Port 80</address>
</body></html>

В данный момент я застрял здесь, и я могу использовать только модули socket и sys, так что здесь помогают сторонние библиотеки. Если кто-то может указать, где я ошибся, это будет очень ценно, и если у кого-то есть какие-либо советы для подсчета слов. Заранее спасибо!

1 Ответ

0 голосов
/ 09 февраля 2020

... не понят в правильном формате?

Это неверный формат, т. Е. Ваше первоначальное предположение при задании вопроса неверно. И сервер правильно воспринимает это как неправильный запрос.

request = ''' GET / tests/a.html HTTP/1.1
HOST: 162.246.156.195
IF-MODIFIED-SINCE: <>
Conncection: keep-alive

'''

Во-первых, ваш запрос начинается с <space>GET ... вместо GET .... Тогда у вас есть пробел в компоненте пути, то есть /<space>test/a.html. Затем вы используете простой перевод строки (\n) вместо \r\n в качестве разделителя строк. И время, указанное в поле If-Modified-Since, недопустимо. И ваше поле Connection содержит опечатку в имени поля.

Обратите внимание, что HTTP намного сложнее, чем вы думаете, он выглядит простым, поскольку он основан только на тексте, но в нем есть много подводных камней и деталей. знать. Если вы не хотите, чтобы существующая библиотека справлялась со сложностью, прочитайте фактический стандарт HTTP (который длинный) и не догадайтесь, как работает HTTP, из нескольких примеров, которые вы видели.

...