python - HTTP-Basic 身份验证上的 404?

标签 python http basic-authentication

我有以下场景:

  1. 我有一个类似 ShoutCast 的服务器,可以提供广播电台的 XML 信息。
  2. 我有一个 Flash Player 客户端需要获取它。
  3. Flash Player 在使用 GET 时无法通过 HTTP-Basic 身份验证获取内容。
  4. 所以我正在构建一个 Python CGI 脚本来处理身份验证和重新提供信息。

希望这是有道理的。本质上,我的脚本通过创建 HTTP 请求、获取数据并在请求时提供数据来充当真实数据的代理。

这是我的 Python

#!/usr/bin/python
import base64, cgitb, sys, urllib2

cgitb.enable()

print "Content-Type: text/xml"
print

username = "username"
password = "password"
url = "http://s6.voscast.com:7158/admin.cgi?mode=viewxml"

auth = base64.encodestring('%s:%s' % (username, password))[:-1]
request = urllib2.Request(url)
request.add_header("Authorization", "Basic %s" % auth)

try:
    handle = urllib2.urlopen(request)
except IOError, e:
    print "Something Failed."
    sys.exit(1)

print handle.read()

很简单,对吧?不幸的是,它不起作用。如果我在浏览器中访问该网站并输入相同的用户名和密码,它就可以工作;我可以看到 XML 树。

相反,我在 stdout 中得到以下输出:

Content-Type: text/xml

ICY 404 Resource Not Found
icy-notice1:<BR>SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>
icy-notice2:The resource requested was not found<BR>

我做错了什么?在浏览器中给定相同的 URL、用户名和密码,一切正常。我错过了什么?

最佳答案

它可能还需要 User-Agent 或 Accepts header 。

尝试使用 Firefox 或 Chrome 开发工具中的 Firebug 或 LiveHTTP Headers 比较/复制浏览器发送的一些 http header 。比较您的十六进制密码以确认它是正确的。然后一次一个地添加其他 header ,直到您发现问题为止。

关于python - HTTP-Basic 身份验证上的 404?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923413/

相关文章:

python - PyCharm 自动完成

python - 如何在 Google App Engine 上为社交新闻提要建模

http - HTTP header 值中允许使用哪些字符?

perl - 如何从 perl 访问 HTTP 基本身份验证用户名?

python - 在 Python 文档字符串中, `:obj:` 有什么作用?

Python P2P 网络(NAT Punchtrough)

java - 如何在REST应用程序中获取 "X-Forwarded-Proto" header ?

php - 将此 .php 转换为 ObjC 可运行的 NSURLSession POST 请求?

objective-c - iOS 似乎绕过了基本的服务器身份验证

ruby - 葡萄获取用户名 :password from BasicAuth