显示响应位置标题,包括是否有问号

时间:2019-08-10 08:44:49

标签: python http flask python-requests query-string

对于Python请求,如何确定服务器返回的位置标头的值?如果我有简单的网络服务器

from flask import Flask, Response, request

def root():
    return Response(headers={
        'location': 'http://some.domain.com/?'  # Note the ?
    })

app = Flask('app')
app.add_url_rule('/', view_func=root)

app.run(host='0.0.0.0', port=8081, debug=False)

然后运行

import requests

response = requests.get('http://localhost:8081/', allow_redirects=False)
print(response.headers['location'])

我知道

http://some.domain.com/
/

之后的

没有问号


这与Flask request: determine exact path, including if there is a question mark有关。我当时使用Python请求来测试返回重定向的应用程序,但我意识到请求正在删除位置标头中的尾随问号。

1 个答案:

答案 0 :(得分:0)

这是一条红鲱鱼:请求并未从位置标头中剥离问号。如果将Flask服务器更改为返回应该是两个相同的标头,则一个location和一个test

def root():
    return Response(headers={
        'location': 'http://some.domain.com/?',  # Note the ?
        'test':     'http://some.domain.com/?',  # Note the ?
    })

然后我们通过套接字发出原始HTTP请求

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.connect(('127.0.0.1', 8081))  

request = \
    f'GET / HTTP/1.1\r\n' \
    f'host:127.0.0.1\r\n' \
    f'\r\n'
sock.send(request.encode()) 
response = b''
while b'\r\n\r\n' not in response:
    response += sock.recv(4096)
sock.close()
print(response)

响应包含带有test的{​​{1}}头

?

但有一个test: http://some.domain.com/?\r\n 头,但没有location

?

因此,Flask(或服务器中使用的其他组件之一)似乎正在操纵返回的位置标头。