- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我们有一个服务器来为我们的 API 提供服务。
我已经使用它一段时间了,现在我正在经历我现在所说的一种从我们的 API 服务器到某些目的地的服务器偏见 (对某些发件人好,对其他发件人不好)我想知道到底发生了什么。
一些请求正在通过 TCP 重置 (RST) 进行响应,但其他请求确实得到正确响应(200 状态,预期内容)。
我想澄清的是,这并不是在服务器中明确完成的(我们实际上并没有选择要拒绝的目的地),而且对于我尝试过的每个客户端,我总是得到相同的结果(我的意思是,行为是确定性的,仅取决于发件人 - 至少表面上如此)。
这是我发送的实际请求:
GET /api/guilherme@buddycloud.org/metadata/posts HTTP/1.1
Host: demo.buddycloud.org
这是我写的 python 代码,我在不同的地方运行:
from requests import Request, Session
headers = {
'Accept' : '*/*',
'Accept-Encoding' : 'gzip,deflate,sdch',
'Accept-Language' : 'en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4',
'Cache-Control' : 'no-cache',
'Host' : 'demo.buddycloud.org'
}
req = Request('GET',
'https://demo.buddycloud.org/api/guilherme@buddycloud.org/metadata/posts',
headers=headers)
r = req.prepare()
print r.url
s = Session()
resp = s.send(r, verify=False)
print resp, resp.ok
print resp.content
我尝试过的几个不同场景:
Windows 7 64 位,Python 2.7.3,Requests 1.2.3
运行此代码并引发此异常:
requests.exceptions.ConnectionError:
HTTPSConnectionPool(host='demo.buddycloud.org', port=443):
Max retries exceeded with url: /api/guilherme@buddycloud.org/metadata/posts
(Caused by <class 'socket.error'>:
[Errno 10054] An existing connection was forcibly closed by the remote host)
使用 Wireshark 我注意到发生了这种情况,因为我从服务器获得了 TCP 重置。
Ubuntu、Python 2.7.3、请求 1.2.3
我运行了完全相同的代码,没有遇到任何问题,但得到了预期的响应:
https://demo.buddycloud.org/api/guilherme@buddycloud.org/metadata/posts
<Response [200]> True
{
"title" : "guilherme@buddycloud.org Channel Posts",
"description":"This is my buddycloud channel =)",
"access_model":"open",
"creation_date":"2013-04-13T15:24:53.471Z",
"channel_type":"personal",
"default_affiliation":"publisher"
}
阅读到这里,有人可能会猜到这是 Windows x Linux 的问题,但您会看到其中一个场景是 Linux 环境,但我仍然遇到同样的问题。
通过 Postman
正如人们所期望的那样,它工作得很好。
在我们的 Heroku 服务器上,Python 2.7.4,Requests 1.2.3
我们有一个应用向我们的 API 发出相同的调用。那里发生了一个非常相似的错误,我确信原因是一样的(服务器发送 TCP 重置)。这是引发的异常:
HTTPSConnectionPool(host='demo.buddycloud.org', port=443):
Max retries exceeded with url:
/api/guilherme@buddycloud.org/metadata/posts
(Caused by : [Errno 104] Connection reset by peer)
所以我很想知道为什么我们的服务器会这样。我花了很多时间认为问题出在我这边,但我猜它不是,它是由服务器上的某些东西引起的,可能是一些错误配置或与 SSL 相关的东西。
请注意,我的代码通过 python-requests 发送的 header 与 Postman 发送的相同 - 我实际上是在尝试模拟 Postman 的成功请求,但这行不通。
另请注意,在我尝试执行此操作的所有地方,Python 和 Requests 的版本都完全相同。
谁能帮我知道这是怎么回事?在此先致谢,我愿意回答您可能提出的任何其他问题。
最佳答案
这似乎是 ssl 协商的问题。这段代码在 heroku 上对我有用。使用 'SSLv3'
也可以。 'SSLv23'
(默认)中断,不要问我为什么。
from requests import Session
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
class SSLAdapter(HTTPAdapter):
'''An HTTPS Transport Adapter that uses an arbitrary SSL version.'''
def __init__(self, ssl_version=None, **kwargs):
self.ssl_version = ssl_version
super(SSLAdapter, self).__init__(**kwargs)
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=self.ssl_version)
s = Session()
s.mount('https://', SSLAdapter('TLSv1'))
req = s.get('https://demo.buddycloud.org/api/guilherme@buddycloud.org/metadata/posts', verify=False)
print(req)
(SSLAdapter
来自@Lukasa 的博客)
关于ssl - 服务器总是将 RST 发送到某些目的地,并向其他目的地发送适当的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478572/
除了这一行,我的代码有效 .FindFirst "[DONOR_CONTACT_ID] = strTemp2" 我希望我的代码检查是否有记录,其中存在特定的 DONOR_CONTACT_ID,因为有多
[FIN, ACK]、[RST]和[RST, ACK]是什么原因,如何避免? 是否是由于 SO 的 TCP 参数之间存在某种不匹配?服务器在 TCP/IP 连接中回复 [FIN, ACK] 是什么意思
我有简单的“echo”客户端-服务器代码,并通过tcpdump监视tcp流,客户端在发送274之后始终发送RST。总是。但是我不知道如何找到问题所在。客户端: //FILE to read from
当应用程序从套接字接收数据时,它将按照数据发送的正确顺序接收数据。 TCP 将知道如何根据每个数据包 header 中包含的序列号对数据重新排序。 但是 RST 数据包呢,例如:如果另一方发送了一些数
我正在尝试调试一个场景,为此我希望 http 服务器通过 RST 关闭连接。现在它正在使用 fin/ack 进行优雅的关闭。 有什么方法可以手动发送 RST 数据包以关闭连接作为当前流的一部分?可能是
为什么 TCP RST 数据包不需要确认?是不是因为RST的发送端每次收到对方的包都会继续发送RST? 相关说明,有效RST包中的确认号怎么会是0呢? 最佳答案 On a related note,
我真正喜欢 Markdown 的地方在于我可以执行以下操作: 写```回车 粘贴我剪贴板中的所有垃圾 编写``` 我现在有一个工作代码块 在 RST 中,我必须执行以下操作: 编写.. codeblo
如何获得在 rst 中加粗的代码(等宽)文本(我使用的是 Sphinx)? :: 中的任何内容似乎是按字面呈现的,就像 `` 一样,所以 ``**bold**`` 不起作用。 最佳答案 一般来说,嵌套
我正在使用 Sphinx 来记录返回字典的方法。 def do_stuff(foo, bar): """Do some stuff :param foo: I'm an argumen
我对将图像放入 pelican 的 markdown 语法感到困惑。 当我有了这个,一切正常。 .. image:: /images/Rugby-Tackle.jpg :alt: About
我有一个已连接的套接字,我想中止关闭它,但我不希望将 RST 发送到另一端。这可以吗? 最佳答案 您的问题体现了自相矛盾。 “异常关闭”== RST。 即使实际的中止关闭没有立即发送,TCP 也有义务
使用 shutdown() 关闭套接字连接的写入方向后,所有后续接收到的数据都会导致发送 RST 数据包,并且 read() 返回大小为 0 的数据,表示读取方向的 EOF。即使阅读方向没有关闭,为什
我有一个 RST 树,它的结构是: struct node { int key; node *left, *right; } *root; 我的功能是删除带有“v”键的节点: void
如果我有一个带有连接套接字的进程,并且我终止了这个进程,那么 Windows 将导致发送一个 RST 数据包。 是否保证(是否在某处记录)当进程终止时始终发送 RST 数据包,还是可以发送 FIN 数
我写了一个小命令行工具,想在文档中添加“--help”用法消息。 因为我很懒,所以我希望更新过程尽可能简单。这是我希望更新工作流程的样子: 导致更新使用消息的更新代码。 运行更新文档的脚本:新的用法消
我正在使用 gitlab docker image 来部署服务,Web 端口是主机上的 8080。运行 gitlab 后,我可以看到端口正常: CONTAINER ID IMAGE
我正在开发服务器,客户端消息通过手机发送。服务器和手机通过 Wifi 连接。 客户端向服务器发送 HTTP Post 消息,服务器应该回复 200 ok。它适用于大多数系统,但在某些系统中,服务器收到
在收到一个 TCP RST 数据包后,主机是否会丢弃接收缓冲区中已被远程主机确认但未被使用套接字的应用进程读取的所有剩余数据? 我想知道一旦我对其他主机所说的不再感兴趣(例如,为了节省资源)就关闭套接
我有一个客户端和服务器运行在同一台服务器(Linux 机器)上,它们之间有 TCP 连接。我观察到,当我杀死客户端时,内核/操作系统会在客户端被杀死 2 秒后发送 RST 数据包。我的问题是哪个内核参
Windows socket close(closesocket)函数生成RST。 在 Linux 上,当我调用 close 函数关闭一个 tcp 套接字时,它会通过来自客户端服务器的 fin/ack
我是一名优秀的程序员,十分优秀!