从侦听套接字/ HTTPServer获取传入的URL

时间:2018-12-19 02:58:22

标签: python python-3.x sockets httpserver

Stackoverflow的好日子,

今天早上,我遇到了一个似乎无法找到有效答案的问题。我正在尝试通过HTTPServer或简单的socket获取完整的URL(地址栏中显示的URL),该URL是从我将服务器重定向到localhost时获得的(除了下面的侦听代码,没有任何内容(没有Web服务器,没有页面,什么都没有)。)带有tokenscope变量(如下面的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 :(得分:1)

 http://localhost/#token=aai789as&scope=book%3Aedit+chat%3Aedit

这种URL仅部分传输到服务器。 #及其后的所有内容仅是浏览器已知的,可以通过使用Javascript作为location.hash进行访问。它不会传输到服务器,即服务器将看到的全部为http://localhost/

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

此部分提供服务器将知道的URL中的所有内容。 localhost标头中的Host指定主机名,GET /指定路径/-组成'http://' + 'localhost' + '/',即http://localhost/

有关更多信息,请参见Is the anchor part of a URL being sent to a web server?