HTTPS 请求导致使用 Python 3 的 Windows 中重置连接

2024-01-09

当我在 cygwin 中将以下函数与 Python 3.2.3 包一起使用时,它会挂起对任何 https 主机的任何请求。它将抛出以下错误:60 秒后,[Errno 104] 连接被对等方重置。

更新:我认为这仅限于 cygwin,但这也发生在带有 Python 3.3 的 Windows 7 64 位中。我现在就尝试3.2。使用windows命令shell时出现的错误是: urlopen 错误 [WinError 10054] 现有连接被远程主机强制关闭

UPDATE2(Electric-Bugaloo):这仅限于我尝试使用的几个网站。我对谷歌和其他主要网站进行了测试,没有任何问题。看来它与这个错误有关:

http://bugs.python.org/issue16361 http://bugs.python.org/issue16361

具体来说,服务器在 client-hello 之后挂起。这是由于 python3.2 和 3.3 编译版本附带的 openssl 版本所致。它错误地识别了服务器的 ssl 版本。现在,我需要代码在打开与受影响站点的连接时自动将我的 ssl 版本降级到 sslv3,如本文中所示:

如何使用urllib2获取使用SSLv3加密的网页 https://stackoverflow.com/questions/8039859/how-to-use-urllib2-to-get-a-webpage-using-sslv3-encryption

但我无法让它发挥作用。

def worker(url, body=None, bt=None):
    '''This function does all the requests to wherever for data

    takes in a url, optional body utf-8 encoded please, and optional body type'''

    hdrs = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                   'Accept-Language': 'en-us,en;q=0.5',
                   'Accept-Encoding': 'gzip,deflate',
                   'User-Agent': "My kewl Python tewl!"}
    if 'myweirdurl' in url:
        hdrs = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                   'Accept-Language': 'en-us,en;q=0.5',
                   'Accept-Encoding': 'gzip,deflate',
                   'User-Agent': "Netscape 6.0"}

    if bt:
        hdrs['Content-Type'] = bt
    urlopen = urllib.request.urlopen
    Request = urllib.request.Request
    start_req = time.time()
    logger.debug('request start: {}'.format(datetime.now().ctime()))
    if 'password' not in url:
        logger.debug('request url: {}'.format(url))
    req = Request(url, data=body, headers=hdrs)
    try:
        if body:
            logger.debug("body: {}".format(body))
            handle = urlopen(req, data=body, timeout=298)
        else:
            handle = urlopen(req, timeout=298)
    except socket.error as se:
        logger.error(se)
        logger.error(se.errno)
        logger.error(type(se))
        if hasattr(se, 'errno') == 60: 
            logger.error("returning: Request Timed Out")
            return 'Request Timed Out'
    except URLError as ue:
        end_time = time.time()
        logger.error(ue)
        logger.error(hasattr(ue, 'code'))
        logger.error(hasattr(ue, 'errno'))
        logger.error(hasattr(ue, 'reason'))
        if hasattr(ue, 'code'):
            logger.warn('The server couldn\'t fulfill the request.')
            logger.error('Error code: {}'.format(ue.code))
            if ue.code == 404:
                return "Resource Not Found (404)"
        elif hasattr(ue, 'reason') :
            logger.warn('We failed to reach a server with {}'.format(url))
            logger.error('Reason: {}'.format(ue.reason))

            logger.error(type(ue.reason))
            logger.error(ue.reason.errno)
            if ue.reason == 'Operation timed out':
                logger.error("Arrggghh, timed out!")
            else:
                logger.error("Why U no match my reason?")
                if ue.reason.errno == 60:
                    return "Operation timed out"
        elif hasattr(ue, 'errno'):
            logger.warn(ue.reason)
            logger.error('Error code: {}'.format(ue.errno))
            if ue.errno == 60:
                return "Operation timed out"
        logger.error("req time: {}".format(end_time - start_req))
        logger.error("returning: Server Error")
        return "Server Error"
    else:
        resp_headers = dict(handle.info())
        logger.debug('Here are the headers of the page : {}'.format(resp_headers))
        logger.debug("The true URL in case of redirects {}".format(handle.geturl()))           
        try:
            ce = resp_headers['Content-Encoding']
        except KeyError as ke:
            ce = None
        else:
            logger.debug('Content-Encoding: {}'.format(ce))
        try:
            ct = resp_headers['Content-Type']
        except KeyError as ke:
            ct = None            
        else:
            logger.debug('Content-Type: {}'.format(ct))
        if ce == "gzip":
            logger.debug("Unzipping payload")
            bi = BytesIO(handle.read())
            gf = GzipFile(fileobj=bi, mode="rb")
            if "charset=utf-8" in ct.lower() or ct == 'text/html' or ct == 'text/plain':
                payload = gf.read().decode("utf-8")
            else:
                logger.debug("Unknown content type: {}".format(ct))
                sys.exit()
            return payload
        else:
            if ct is not None and "charset=utf-8" in ct.lower() or ct == 'text/html' or ct == 'text/plain':
                return handle.read().decode("utf-8")
            else:
                logger.debug("Unknown content type: {}".format(ct))
                sys.exit()

我想通了,这是在 Windows 上运行所需的代码块:

'''had to add this windows specific block to handle this bug in urllib2:
http://bugs.python.org/issue11220
'''
if "windows" in platform().lower():
    if 'my_wacky_url' or 'my_other_wacky_url' in url.lower():
        import ssl
        ssl_context = urllib.request.HTTPSHandler(
                                              context=ssl.SSLContext(ssl.PROTOCOL_TLSv1))
        opener = urllib.request.build_opener(ssl_context)
        urllib.request.install_opener(opener)
#end of urllib workaround

我在第一次尝试之前添加了这个斑点:块,它的效果就像一个魅力。感谢安德烈的帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTPS 请求导致使用 Python 3 的 Windows 中重置连接 的相关文章

  • 补丁 - 为什么相对补丁目标名称不起作用?

    我已经从模块导入了一个类 但是当我尝试修补类名而不使用模块作为前缀时 出现类型错误 TypeError Need a valid target to patch You supplied MyClass 例如 以下代码给出了上述错误 imp
  • Pandas:GroupBy 到 DataFrame

    参考这个关于 groupby 到 dataframe 的非常流行的问题 https stackoverflow com questions 10373660 converting a pandas groupby object to dat
  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • 检查 Python 中的可迭代对象中的所有元素的谓词是否计算为 true

    我很确定有一个常见的习语 但我无法通过谷歌搜索找到它 这是我想做的 用Java Applies the predicate to all elements of the iterable and returns true if all ev
  • Mac OS X 中文件系统的 Unicode 编码在 Python 中不正确?

    在 OS X 和 Python 中处理 Unicode 文件名有点困难 我试图在代码中稍后使用文件名作为正则表达式的输入 但文件名中使用的编码似乎与 sys getfilesystemencoding 告诉我的不同 采取以下代码 usr b
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • Gspread如何复制sheet

    在 Stackoverflow 上进行谷歌搜索和搜索后 我想我找不到有关如何复制现有工作表 现有模板工作表 并将其保存到另一个工作表中的指南 根据文档 有重复表 https gspread readthedocs io en latest
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • 小组芹菜链任务

    shared task def process record x return 1 2 4 4 5 6 shared task def add pro id return pro id 10 shared task def dmap it
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 连接mysql和python.3

    我是 django 的新手 使用 django 1 5 和 python 3 3 有没有办法在 python 3 3 上安装 mysqlDB 或 有其他方法可以连接它们吗 PyMySQL https github com petehunt
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460

随机推荐