Получить входящий URL из сокета прослушивания / HTTPServer - PullRequest
0 голосов
/ 19 декабря 2018

Добрый день Stackoverflow,

Этим утром я столкнулся с проблемой, на которую не могу найти работающего ответа.Я пытаюсь получить полный URL-адрес (который отображается в адресной строке) через HTTPServer или простой socket, который я получаю с сервера, который перенаправляет меня на localhost (за которым ничего не стоит(без веб-сервера, без страниц, ничего), за исключением кода прослушивания ниже.) с переменными token и scope (как видно из приведенного ниже URL-адреса).Моим желаемым результатом было бы сохранение этих переменных, чтобы я мог работать с ними: http://localhost/#token=aai789as&scope=book%3Aedit+chat%3Aedit

Я пробовал следующее с некоторым прогрессом, но не с желаемым результатом:

from http.server import SimpleHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs

class MyHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        qs = {}
        path = self.path
        if '?' in path:
            path, tmp = path.split('?', 1)
            qs = urlparse.parse_qs(tmp)

        print(self.path)
        print (path, qs)

    def log_request(self, code=None, size=None):
        print('Request')

    def log_message(self, format, *args):
        print('Message')

if __name__ == "__main__":
    try:
        server = HTTPServer(('localhost', 80), MyHandler)
        print('Started http server')
        server.serve_forever()
    except KeyboardInterrupt:
        print('^C received, shutting down server')
        server.socket.close()

приведенный выше фрагмент загружается, но на самом деле ничего не печатает.На самом деле, он печатает только пустые заявления.Но он действительно обнаруживает соединение.Вот как это делается:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 80))
s.listen(1)

conn, addr = s.accept()
d = conn.recv(4096)
conn.close()

print(d)

Но это возвращает больше, чем пустые операторы, но вряд ли достаточно получить переменные из URL:

b'\x07\n'
b'GET / HTTP/1.1\r\nHost: localhost\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:64.0) Gecko/20100101 Firefox/64.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en,en-US;q=0.7,nl;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nDNT: 1\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\n\r\n'

Я не знаю, что яЯ должен делать, и так как я не знаю, что именно я ищу;поиск по документации занял лучшую половину моего дня.Поэтому я обращаюсь к всегда полезному Stackoverflow в надежде найти лучшее знание, чем у меня есть.

Спасибо за ваше время, - Брент

1 Ответ

0 голосов
/ 19 декабря 2018
 http://localhost/#token=aai789as&scope=book%3Aedit+chat%3Aedit

Этот вид URL передается на сервер только частично.# и все, что после, известно только браузеру и может быть доступно как location.hash с помощью Javascript.Он не будет передан на сервер, т. Е. Все, что сервер увидит, это http://localhost/.

b'GET / HTTP/1.1\r\nHost: localhost\r\n ...'

. В этой части содержится все, начиная с URL, который будет знать сервер.localhost в заголовке Host указывает имя хоста, а GET / указывает путь / - что вместе составляет 'http://' + 'localhost' + '/', то есть http://localhost/.

Для получения дополнительной информации см. Isчасть привязки URL-адреса, отправляемого на веб-сервер? .

...