【问题标题】:Suds Error: BadStatusLine in httplib泡沫错误:httplib 中的 BadStatusLine
【发布时间】:2011-10-11 11:58:36
【问题描述】:

我正在使用 suds 0.3.6。创建 suds 客户端时,我随机得到一个错误:

httplib.py,_read_status(),第 355 行,类 httplib.BadStatusLine'

这是用于创建客户端的代码:

imp = Import('http://www.w3.org/2001/XMLSchema')
imp.filter.add('http://tempuri.org/encodedTypes')
imp.filter.add('http://tempuri.org/')
self.doctor = ImportDoctor(imp)

self.client = Client(self.URL,doctor=self.doctor)

这个错误是什么意思,我该如何解决?

谢谢!

【问题讨论】:

    标签: python soap suds httplib


    【解决方案1】:

    我遇到了同样的问题。为了解决这个问题,我打开了完整的泡沫记录:

    logging.basicConfig(level=logging.INFO)
    logging.getLogger("suds.client").setLevel(logging.DEBUG)
    logging.getLogger("suds.transport").setLevel(logging.DEBUG)
    logging.getLogger("suds.xsd.schema").setLevel(logging.DEBUG)
    logging.getLogger("suds.wsdl").setLevel(logging.DEBUG)
    

    通过调试输出,我注意到当 SUDS 尝试下载 http://www.w3.org/2001/xml.xsd 时发生了错误(该特定模式在某种程度上被我试图调用的服务引用)。原来 w3.org 服务器非常过载(link,link)。

    SUDS Client 可以配置为使用缓存。我实现了一个缓存对象,它返回 SUDS 命中的两个 w3.org URL 的内容(您可以在日志输出中找到这些 URL)。我使用浏览器获取这两个模式并将它们保存到磁盘,然后将内容作为字符串常量放入源代码文件中。

    from suds.cache import NoCache
    from suds.sax.parser import Parser
    
    class StaticSudsCache(NoCache):
        def get(self, id):
            STATIC = {"http://www.w3.org/2001/xml.xsd": XML_XSD,
                    "http://www.w3.org/2001/XMLSchema.xsd": XMLSCHEMA_XSD }
            xml_string = STATIC.get(id.name)
            if xml_string:
                p = Parser()
                return p.parse(string=xml_string)
    
    from suds.client import Client
    c = Client(service_url, cache=StaticSudsCache())
    
    XML_XSD = """... contents from file ..."""
    XMLSCHEMA_XSD = """... contents from file ..."""
    

    包含 XML 架构内容的完整代码是 here。

    【讨论】:

    • 感谢 codeape,这解决了我的问题!,我的 suds 是 v0.4,我在 STATIC = ... 行之前做了一个“打印 ID”,我得到:“6676093947907621806-document”所以,我将 {"w3.org/2001/xml.xsd": XML_XSD} 更改为 {"6676093947907621806-document": XML_XSD} 并再次开始工作。
    【解决方案2】:

    httplib 是一个纯 python 模块。您可以查看代码以获取更准确的信息... 如果无法将状态行解析为有效的 HTTP/1.0 或 1.1 状态行,则会引发 BadStatusLine。 暂时没有解决办法

    【讨论】:

      【解决方案3】:

      这意味着服务器端存在问题,导致 HTTP 服务器回复一些垃圾而不是普通的“HTTP/1.1 200 OK”(或类似)行。你无法解决这个问题。

      【讨论】:

      • 我在创建客户端时可能会收到此错误,然后几秒钟后重试,它会起作用。什么会导致服务器只是偶尔发送垃圾数​​据?
      • 实际上,从极高的负载(如此之高的服务器开始出现故障)到非纯代码(无论在函数式语言中意味着什么)代码。
      • 在 httplib.py 中放入一些打印后,我发现我正在联系 www.w3.org,有时该站点在 HTTP 回复中发回了一个空字符串。这是我找到的相关帖子:stackoverflow.com/questions/7505653/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      相关资源
      最近更新 更多