- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序连接到 http 服务器以下载多个文件(一次一个文件)。服务器间歇性地为有效文件返回 http 404
。这只发生在生产环境中,我无权访问服务器。
我在我的应用程序中进行了重试,现在我想编写一个模拟这种情况的测试用例。
我读到了有关 tcpkill
的信息,但这些似乎并没有达到目的。
我也在阅读有关 squid
(设置代理)、iptables 的内容,但它们似乎也不能满足我的目的。
我正在寻找的是,在对服务器发出 1000 次成功的 http 请求后,我应该关闭错误代码为 404 的第 1001 个 http 连接。我倾向于使用某些代理,但不知道是否有任何代理是动态的。
有人可以提出建议吗?
最佳答案
我不确定它是否适合测试用例,但我不知道任何现有的解决方案(尽管我很确定那里有一个——我只是不知道不知道在哪里),这似乎是一个有趣的问题,所以我写了一个小的 Python 脚本来完成它。它仅在 Python 3 上运行,所以请确保你已经拥有它。 (在撰写本文时,Python 2 更为常见。)
#!/usr/bin/env python3
# Latest version at http://stackoverflow.com/a/16494059/200291
"""
Accept TCP connections, usually proxying to another address, but occasionally
responding with 404 Not Found.
"""
import socket
import select
DROP_DATA = b'HTTP/1.0 404 Not Found\r\n\r\nnot found\r\n'
PROXY_BUFFER_SIZE = 4096
class Reactor(object):
def __init__(self):
self.reactants = []
def add_reactant(self, reactant):
self.reactants.append(reactant)
def remove_reactant(self, reactant):
self.reactants.remove(reactant)
def iterate(self):
r, w, x = [], [], []
for reactant in self.reactants[:]:
reactant.modify(self, r, w, x)
r, w, x = select.select(r, w, x)
for reactant in self.reactants[:]:
reactant.notify(self, r, w, x)
def loop(self):
while self.reactants:
self.iterate()
class Acceptor(object):
def __init__(self, socket, action):
self.socket = socket
self.action = action
def modify(self, reactor, r, w, x):
r.append(self.socket)
def notify(self, reactor, r, w, d):
if self.socket in r:
result = self.socket.accept()
self.action(result)
class Dropper(object):
def __init__(self, socket):
self.socket = socket
self.queued = DROP_DATA
def modify(self, reactor, r, w, x):
w.append(self.socket)
def notify(self, reactor, r, w, x):
if self.socket in w:
if self.queued:
written = self.socket.send(self.queued)
self.queued = self.queued[written:]
else:
self.socket.shutdown(socket.SHUT_RDWR)
self.socket.close()
reactor.remove_reactant(self)
class Connector(object):
def __init__(self, addr, done):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setblocking(False)
self.socket.connect_ex(addr)
self.done = done
def modify(self, reactor, r, w, x):
w.append(self.socket)
def notify(self, reactor, r, w, x):
if self.socket in w:
self.socket.setblocking(True)
reactor.remove_reactant(self)
self.done(self.socket)
class SimplexProxy(object):
def __init__(self, source, dest, done):
self.source = source
self.dest = dest
self.buffer = b''
self.want_shutdown = False
self.done = done
def modify(self, reactor, r, w, x):
if self.buffer or self.want_shutdown:
w.append(self.dest)
else:
r.append(self.source)
def notify(self, reactor, r, w, x):
if self.source in r:
read = self.source.recv(PROXY_BUFFER_SIZE)
if not read:
self.want_shutdown = True
else:
self.buffer += read
if self.dest in w:
if self.want_shutdown:
self.dest.shutdown(socket.SHUT_WR)
reactor.remove_reactant(self)
else:
written = self.dest.send(self.buffer)
self.buffer = self.buffer[written:]
def join_sockets(reactor, socket_1, socket_2):
closed = 0
def done():
nonlocal closed
closed += 1
if closed >= 2:
socket_1.close()
socket_2.close()
reactor.add_reactant(SimplexProxy(socket_1, socket_2, done))
reactor.add_reactant(SimplexProxy(socket_2, socket_1, done))
def run_server(reactor, addr, action, backlog=5):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
sock.bind(addr)
sock.listen(backlog)
reactor.add_reactant(Acceptor(sock, action))
def proxy_connect(reactor, our_socket, their_addr):
def connected(their_socket):
join_sockets(reactor, our_socket, their_socket)
reactor.add_reactant(Connector(their_addr, connected))
def run_dropper(reactor, our_addr, their_addr, drop_freq):
count = 0
def action(accepted):
nonlocal count
count += 1
sock, addr = accepted
if count % drop_freq == 0:
reactor.add_reactant(Dropper(sock))
else:
proxy_connect(reactor, sock, their_addr)
run_server(reactor, our_addr, action)
def main():
def parse_port(s):
p = int(s)
if not (0 <= p < 65536):
raise ValueError("invalid port")
return p
def parse_natural(s):
n = int(s)
if n > 0:
return n
else:
raise ValueError("must be a natural number")
import argparse
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('-H', '--local-host', metavar='HOST',
default='0.0.0.0', help="address to listen on")
parser.add_argument('-p', '--local-port', type=parse_port, metavar='PORT',
help="local port to listen on", required=True)
parser.add_argument('remote_host', help="host to connect to")
parser.add_argument('remote_port', type=parse_port,
help="port to connect to")
parser.add_argument('-D', '--drop-frequency', type=parse_natural,
metavar='FREQ', help="how many requests per drop",
required=True)
args = parser.parse_args()
def resolve(host, port):
info = socket.getaddrinfo(host, port,
socket.AF_INET, socket.SOCK_STREAM)
return info[0][-1]
local = resolve(args.local_host, args.local_port)
remote = resolve(args.remote_host, args.remote_port)
reactor = Reactor()
run_dropper(reactor, local, remote, args.drop_frequency)
try:
reactor.loop()
except KeyboardInterrupt:
pass
if __name__ == '__main__':
main()
要使用它来代理 localhost:8000
到端口 9000
,每 5 个连接丢弃一次,像这样运行它:
% ./dropproxy.py localhost 8000 -p 9000 -D 5
关于linux - 如何使用 404 错误代码中止 HTTP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16493616/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!