summaryrefslogtreecommitdiff
path: root/src/M2Crypto/SSL/timeout.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/M2Crypto/SSL/timeout.py')
-rw-r--r--src/M2Crypto/SSL/timeout.py50
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')