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