Added flags argument to send and recv variants, for completeness.

This commit is contained in:
Ryan Williams
2009-07-19 00:21:12 -07:00
parent 53d263849e
commit 00f9c3334d

View File

@@ -37,15 +37,15 @@ from errno import EWOULDBLOCK, EAGAIN
__all__ = ['GreenSocket', 'GreenFile', 'GreenPipe'] __all__ = ['GreenSocket', 'GreenFile', 'GreenPipe']
def higher_order_recv(recv_func): def higher_order_recv(recv_func):
def recv(self, buflen): def recv(self, buflen, flags=0):
if self.act_non_blocking: if self.act_non_blocking:
return self.fd.recv(buflen) return self.fd.recv(buflen, flags)
buf = self.recvbuffer buf = self.recvbuffer
if buf: if buf:
chunk, self.recvbuffer = buf[:buflen], buf[buflen:] chunk, self.recvbuffer = buf[:buflen], buf[buflen:]
return chunk return chunk
fd = self.fd fd = self.fd
bytes = recv_func(fd, buflen) bytes = recv_func(fd, buflen, flags)
if self.gettimeout(): if self.gettimeout():
end = time.time()+self.gettimeout() end = time.time()+self.gettimeout()
else: else:
@@ -64,17 +64,17 @@ def higher_order_recv(recv_func):
else: else:
raise raise
else: else:
bytes = recv_func(fd, buflen) bytes = recv_func(fd, buflen, flags)
self.recvcount += len(bytes) self.recvcount += len(bytes)
return bytes return bytes
return recv return recv
def higher_order_send(send_func): def higher_order_send(send_func):
def send(self, data): def send(self, data, flags=0):
if self.act_non_blocking: if self.act_non_blocking:
return self.fd.send(data) return self.fd.send(data, flags)
count = send_func(self.fd, data) count = send_func(self.fd, data, flags)
if not count: if not count:
return 0 return 0
self.sendcount += count self.sendcount += count
@@ -102,9 +102,9 @@ def socket_accept(descriptor):
raise raise
def socket_send(descriptor, data): def socket_send(descriptor, data, flags=0):
try: try:
return descriptor.send(data) return descriptor.send(data, flags)
except socket.error, e: except socket.error, e:
if e[0] == errno.EWOULDBLOCK or e[0] == errno.ENOTCONN: if e[0] == errno.EWOULDBLOCK or e[0] == errno.ENOTCONN:
return 0 return 0
@@ -116,9 +116,9 @@ def socket_send(descriptor, data):
# winsock sometimes throws ENOTCONN # winsock sometimes throws ENOTCONN
SOCKET_CLOSED = (errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN) SOCKET_CLOSED = (errno.ECONNRESET, errno.ENOTCONN, errno.ESHUTDOWN)
def socket_recv(descriptor, buflen): def socket_recv(descriptor, buflen, flags=0):
try: try:
return descriptor.recv(buflen) return descriptor.recv(buflen, flags)
except socket.error, e: except socket.error, e:
if e[0] == errno.EWOULDBLOCK: if e[0] == errno.EWOULDBLOCK:
return None return None
@@ -135,7 +135,7 @@ def socket_recv(descriptor, buflen):
raise raise
def file_recv(fd, buflen): def file_recv(fd, buflen, flags=0):
try: try:
return fd.read(buflen) return fd.read(buflen)
except IOError, e: except IOError, e:
@@ -148,7 +148,7 @@ def file_recv(fd, buflen):
raise raise
def file_send(fd, data): def file_send(fd, data, flags=0):
try: try:
fd.write(data) fd.write(data)
fd.flush() fd.flush()
@@ -338,12 +338,12 @@ class GreenSocket(object):
send = higher_order_send(socket_send) send = higher_order_send(socket_send)
def sendall(self, data): def sendall(self, data, flags=0):
fd = self.fd fd = self.fd
tail = self.send(data) tail = self.send(data, flags)
while tail < len(data): while tail < len(data):
trampoline(self.fd, write=True, timeout_exc=socket.timeout) trampoline(self.fd, write=True, timeout_exc=socket.timeout)
tail += self.send(data[tail:]) tail += self.send(data[tail:], flags)
def sendto(self, *args): def sendto(self, *args):
trampoline(self.fd, write=True, timeout_exc=socket.timeout) trampoline(self.fd, write=True, timeout_exc=socket.timeout)