mirror of
https://github.com/moparisthebest/curl
synced 2025-02-28 17:31:46 -05:00
http_pipe.py: replaced epoll with select to support Windows
Removed Unix-specific functionality in order to support Windows: - select.epoll replaced with select.select - SocketServer.ForkingMixIn replaced with SocketServer.ForkingMixIn - socket.MSG_DONTWAIT replaced with socket.setblocking(False) Even though epoll has a better performance and improved socket handling than select, this change should not affect the actual test case.
This commit is contained in:
parent
88b074df3f
commit
f55f8d4c18
@ -357,22 +357,19 @@ class PipelineRequestHandler(SocketServer.BaseRequestHandler):
|
|||||||
self._send_buffer = ""
|
self._send_buffer = ""
|
||||||
self._start_time = time.time()
|
self._start_time = time.time()
|
||||||
try:
|
try:
|
||||||
poller = select.epoll(sizehint=1)
|
|
||||||
poller.register(self.request.fileno(), select.EPOLLIN)
|
|
||||||
while not self._response_builder.processed_end or self._send_buffer:
|
while not self._response_builder.processed_end or self._send_buffer:
|
||||||
|
|
||||||
time_left = self._GetTimeUntilTimeout()
|
time_left = self._GetTimeUntilTimeout()
|
||||||
time_until_next_send = self._GetTimeUntilNextSend()
|
time_until_next_send = self._GetTimeUntilNextSend()
|
||||||
max_poll_time = min(time_left, time_until_next_send) + MIN_POLL_TIME
|
max_poll_time = min(time_left, time_until_next_send) + MIN_POLL_TIME
|
||||||
|
|
||||||
events = None
|
rlist, wlist, xlist = [], [], []
|
||||||
|
fileno = self.request.fileno()
|
||||||
if max_poll_time > 0:
|
if max_poll_time > 0:
|
||||||
|
rlist.append(fileno)
|
||||||
if self._send_buffer:
|
if self._send_buffer:
|
||||||
poller.modify(self.request.fileno(),
|
wlist.append(fileno)
|
||||||
select.EPOLLIN | select.EPOLLOUT)
|
rlist, wlist, xlist = select.select(rlist, wlist, xlist, max_poll_time)
|
||||||
else:
|
|
||||||
poller.modify(self.request.fileno(), select.EPOLLIN)
|
|
||||||
events = poller.poll(timeout=max_poll_time)
|
|
||||||
|
|
||||||
if self._GetTimeUntilTimeout() <= 0:
|
if self._GetTimeUntilTimeout() <= 0:
|
||||||
return
|
return
|
||||||
@ -382,9 +379,10 @@ class PipelineRequestHandler(SocketServer.BaseRequestHandler):
|
|||||||
self._num_written = self._num_queued
|
self._num_written = self._num_queued
|
||||||
self._last_queued_time = 0
|
self._last_queued_time = 0
|
||||||
|
|
||||||
for fd, mode in events:
|
if fileno in rlist:
|
||||||
if mode & select.EPOLLIN:
|
self.request.setblocking(False)
|
||||||
new_data = self.request.recv(MAX_REQUEST_SIZE, socket.MSG_DONTWAIT)
|
new_data = self.request.recv(MAX_REQUEST_SIZE)
|
||||||
|
self.request.setblocking(True)
|
||||||
if not new_data:
|
if not new_data:
|
||||||
return
|
return
|
||||||
new_requests = self._request_parser.ParseAdditionalData(new_data)
|
new_requests = self._request_parser.ParseAdditionalData(new_data)
|
||||||
@ -392,12 +390,10 @@ class PipelineRequestHandler(SocketServer.BaseRequestHandler):
|
|||||||
new_requests, self._request_parser.were_all_requests_http_1_1)
|
new_requests, self._request_parser.were_all_requests_http_1_1)
|
||||||
self._num_queued += len(new_requests)
|
self._num_queued += len(new_requests)
|
||||||
self._last_queued_time = time.time()
|
self._last_queued_time = time.time()
|
||||||
elif mode & select.EPOLLOUT:
|
elif fileno in wlist:
|
||||||
num_bytes_sent = self.request.send(self._send_buffer[0:4096])
|
num_bytes_sent = self.request.send(self._send_buffer[0:4096])
|
||||||
self._send_buffer = self._send_buffer[num_bytes_sent:]
|
self._send_buffer = self._send_buffer[num_bytes_sent:]
|
||||||
time.sleep(0.05)
|
time.sleep(0.05)
|
||||||
else:
|
|
||||||
return
|
|
||||||
|
|
||||||
except RequestTooLargeError as e:
|
except RequestTooLargeError as e:
|
||||||
self.request.send(self._response_builder.WriteError(
|
self.request.send(self._response_builder.WriteError(
|
||||||
@ -415,7 +411,7 @@ class PipelineRequestHandler(SocketServer.BaseRequestHandler):
|
|||||||
self.request.close()
|
self.request.close()
|
||||||
|
|
||||||
|
|
||||||
class PipelineServer(SocketServer.ForkingMixIn, SocketServer.TCPServer):
|
class PipelineServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user