diff options
Diffstat (limited to 'src/M2Crypto/SSL/timeout.py')
-rw-r--r-- | src/M2Crypto/SSL/timeout.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/M2Crypto/SSL/timeout.py b/src/M2Crypto/SSL/timeout.py new file mode 100644 index 0000000..42b0291 --- /dev/null +++ b/src/M2Crypto/SSL/timeout.py @@ -0,0 +1,50 @@ +"""Support for SSL socket timeouts. + +Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved. + +Copyright 2008 Heikki Toivonen. All rights reserved. +""" + +__all__ = ['DEFAULT_TIMEOUT', 'timeout', 'struct_to_timeout', 'struct_size'] + +import sys +import struct + +DEFAULT_TIMEOUT = 600 # type: int + + +class timeout(object): + + def __init__(self, sec=DEFAULT_TIMEOUT, microsec=0): + # type: (int, int) -> None + self.sec = sec + self.microsec = microsec + + def pack(self): + if sys.platform == 'win32': + millisec = int(self.sec * 1000 + round(float(self.microsec) / 1000)) + binstr = struct.pack('l', millisec) + else: + binstr = struct.pack('ll', self.sec, self.microsec) + return binstr + + +def struct_to_timeout(binstr): + # type: (bytes) -> timeout + if sys.platform == 'win32': + millisec = struct.unpack('l', binstr)[0] + # On py3, int/int performs exact division and returns float. We want + # the whole number portion of the exact division result: + sec = int(millisec / 1000) + microsec = (millisec % 1000) * 1000 + else: + (sec, microsec) = struct.unpack('ll', binstr) + return timeout(sec, microsec) + + +def struct_size(): + # type: () -> int + if sys.platform == 'win32': + return struct.calcsize('l') + else: + return struct.calcsize('ll') |