Implement settimeout and gettimeout

This commit is contained in:
donovan
2008-04-29 18:34:28 -07:00
parent a253013629
commit f61bcd8621

View File

@@ -21,7 +21,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
""" """
from eventlet.api import trampoline, get_hub from eventlet.api import exc_after, TimeoutError, trampoline, get_hub
from eventlet import util from eventlet import util
BUFFER_SIZE = 4096 BUFFER_SIZE = 4096
@@ -86,6 +86,12 @@ def socket_accept(descriptor):
def socket_send(descriptor, data): def socket_send(descriptor, data):
timeout = descriptor.gettimeout()
if timeout:
cancel = exc_after(timeout, TimeoutError)
else:
cancel = None
try:
try: try:
return descriptor.send(data) return descriptor.send(data)
except socket.error, e: except socket.error, e:
@@ -96,11 +102,20 @@ def socket_send(descriptor, data):
return 0 return 0
except SSL.WantReadError: except SSL.WantReadError:
return 0 return 0
finally:
if cancel:
cancel.cancel()
# 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):
timeout = descriptor.gettimeout()
if timeout:
cancel = exc_after(timeout, TimeoutError)
else:
cancel = None
try:
try: try:
return descriptor.recv(buflen) return descriptor.recv(buflen)
except socket.error, e: except socket.error, e:
@@ -117,6 +132,9 @@ def socket_recv(descriptor, buflen):
if e[0] == -1 or e[0] > 0: if e[0] == -1 or e[0] > 0:
raise socket.error(errno.ECONNRESET, errno.errorcode[errno.ECONNRESET]) raise socket.error(errno.ECONNRESET, errno.errorcode[errno.ECONNRESET])
raise raise
finally:
if cancel:
cancel.cancel()
def file_recv(fd, buflen): def file_recv(fd, buflen):
@@ -149,7 +167,7 @@ def file_send(fd, data):
class GreenSocket(object): class GreenSocket(object):
is_secure = False is_secure = False
timeout = None
def __init__(self, fd): def __init__(self, fd):
self.fd = fd self.fd = fd
self._fileno = fd.fileno() self._fileno = fd.fileno()
@@ -254,9 +272,6 @@ class GreenSocket(object):
fn = self.setblocking = self.fd.setblocking fn = self.setblocking = self.fd.setblocking
return fn(*args, **kw) return fn(*args, **kw)
# TODO settimeout
# TODO gettimeout
def setsockopt(self, *args, **kw): def setsockopt(self, *args, **kw):
fn = self.setsockopt = self.fd.setsockopt fn = self.setsockopt = self.fd.setsockopt
return fn(*args, **kw) return fn(*args, **kw)
@@ -265,6 +280,12 @@ class GreenSocket(object):
fn = self.shutdown = self.fd.shutdown fn = self.shutdown = self.fd.shutdown
return fn(*args, **kw) return fn(*args, **kw)
def settimeout(self, howlong):
self.timeout = howlong
def gettimeout(self):
return self.timeout
class GreenFile(object): class GreenFile(object):
newlines = '\r\n' newlines = '\r\n'