Python 2.6.6 和 httplib 的头部未正确发送

1 投票
1 回答
725 浏览
提问于 2025-04-17 21:43

我有一个非常简单的Python脚本,用来访问一个特定的接口。出于某种原因,我无法在特定的服务器上发送我需要的授权头。下面的信息是虚构的,但很好地展示了我在做什么。我写的这个脚本在我的虚拟机上运行得很好,但在实际的服务器上却不行。两个环境的Python版本都是2.6.6。我不能更改版本,所以请不要建议我更新。我写这个问题是想了解为什么授权头可能会被去掉。

这两个环境实际上是完全相同的,并且使用配置管理工具来保持设置的一致性。

这是我的脚本。非常简单。我只是通过访问令牌来调用一个API,以返回用户模型。

#! /usr/bin/env python
import httplib, os, socket

conn = httplib.HTTPConnection(socket.gethostname())
conn.set_debuglevel(1)
conn.putrequest("GET", "/api/index.php/user")
conn.putheader('Authorization','Bearer 123456')
conn.endheaders()
response = conn.getresponse()

print response.status
print response.reason
print response.read()

在我的虚拟机上的请求和调试信息

[root@vm scripts]# ./test.py 
send: 'GET /api/index.php/user 
    HTTP/1.1\r\n
    Host: vm.shibby.com\r\n
    Accept-Encoding: identity\r\n
    Authorization: Bearer 123456\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Date: Mon, 10 Mar 2014 22:18:00 GMT
header: Server: Apache/2.2.15 (CentOS)
header: X-Powered-By: PHP/5.3.3
header: X-Frame-Options: SAMEORIGIN, SAMEORIGIN
header: Connection: close
header: Transfer-Encoding: chunked
header: Content-Type: application/json; charset=utf-8
200
OK

虚拟机接收到的请求 - 记录到日志中

2014-03-10 22:18:00 --- DEBUG: headers: HTTP_Header Object
(
    [_accept_content:protected] => 
    [_accept_charset:protected] => 
    [_accept_encoding:protected] => 
    [_accept_language:protected] => 
    [storage:ArrayObject:private] => Array
    (
        [authorization] => Bearer 123456
        [host] => vm.shibby.com
        [accept-encoding] => identity
        [connection] => close
    )
)

在我的服务器上的输出

[root@vm scripts]# ./test.py
send: 'GET /api/index.php/user 
    HTTP/1.1\r\n
    Host: shibby.com\r\n
    Accept-Encoding: identity\r\n
    Authorization: Bearer 123456\r\n\r\n'
reply: 'HTTP/1.1 400 Bad Request\r\n'
header: Date: Mon, 10 Mar 2014 22:24:55 GMT
header: Server: Apache
header: Access-Control-Allow-Origin: *
header: Access-Control-Allow-Headers: Authorization
header: X-Frame-Options: SAMEORIGIN
header: Content-Length: 37
header: Connection: close
header: Content-Type: application/json
400
Bad Request
{"error":"invalid_token"}

服务器接收到的请求

2014-03-10 22:33:23 --- DEBUG: headers: HTTP_Header Object
(
    [_accept_content:protected] => 
    [_accept_charset:protected] => 
    [_accept_encoding:protected] => 
    [_accept_language:protected] => 
    [storage:ArrayObject:private] => Array
        (
            [host] => shibby.com
            [accept-encoding] => identity
            [connection] => close
        )

)

正如你所看到的,授权头没有被目标接口接收到。在这一点上没有任何处理发生,我是在控制器的构造函数中进行记录的。

1 个回答

0

好的,我之前漏掉了一些重要信息。我使用的框架是Kohana 3.2,显然它会把授权头去掉。为了绕过这个问题,我在Apache中添加了一行代码,把它设置为环境变量。看起来这行代码没有被执行,因为我没有以它的子域名形式访问这个端点,具体来说就是 https://api.shibby.com。总之,希望这能帮助到其他人。

撰写回答