示例#1
0
 def _pipe_read(self, buf):
     read = c_ulong(0)
     r = ReadFile(self.pipe_handle, self.read_buffer_ptr, BUFSIZE,
                  byref(read), byref(self.read_overlapped))
     log("ReadFile(..)=%i, len=%s", r, read.value)
     if not r and self.pipe_handle:
         e = GetLastError()
         if e != ERROR_IO_PENDING:
             log("ReadFile: %s", IO_ERROR_STR.get(e, e))
             if e in CONNECTION_CLOSED_ERRORS:
                 raise ConnectionClosedException(
                     CONNECTION_CLOSED_ERRORS[e])
         r = WaitForSingleObject(self.read_event, INFINITE)
         log("WaitForSingleObject(..)=%s, len=%s", WAIT_STR.get(r, r),
             read.value)
         if r and self.pipe_handle:
             raise Exception("failed to read from named pipe handle %s" %
                             self.pipe_handle)
     if self.pipe_handle:
         if not GetOverlappedResult(self.pipe_handle,
                                    byref(self.read_overlapped),
                                    byref(read), False):
             e = GetLastError()
             if e in CONNECTION_CLOSED_ERRORS:
                 raise ConnectionClosedException(
                     CONNECTION_CLOSED_ERRORS[e])
             raise Exception("overlapped read failed: %s" %
                             IO_ERROR_STR.get(e, e))
     if read.value == 0:
         data = None
     else:
         data = string_at(self.read_buffer_ptr, read.value)
     log("pipe_read: %i bytes", len(data or ""))  #, binascii.hexlify(s))
     return data
示例#2
0
def can_retry(e):
    if isinstance(e, socket.timeout):
        return "socket.timeout"
    if isinstance(e, (IOError, OSError)):
        global CONTINUE_ERRNO
        code = e.args[0]
        can_continue = CONTINUE_ERRNO.get(code)
        if can_continue:
            return can_continue

        #SSL pollution - see ticket #1927
        if code=="The read operation timed out":
            return str(code)

        if isinstance(e, CAN_RETRY_EXCEPTIONS):
            return str(e)

        abort = ABORT.get(code, code)
        if abort is not None:
            errno = getattr(e, "errno", None)
            log("can_retry: %s, args=%s, errno=%s, code=%s, abort=%s", type(e), e.args, errno, code, abort)
            raise ConnectionClosedException(e)
    if isinstance(e, CLOSED_EXCEPTIONS):
        raise ConnectionClosedException(e)
    return False
示例#3
0
 def _pipe_write(self, buf):
     bbuf = memoryview_to_bytes(buf)
     size = len(bbuf)
     log("pipe_write: %i bytes", size)   #binascii.hexlify(buf))
     written = c_ulong(0)
     r = WriteFile(self.pipe_handle, c_char_p(bbuf), size, byref(written), byref(self.write_overlapped))
     log("WriteFile(..)=%s, len=%i", r, written.value)
     if not r and self.pipe_handle:
         e = GetLastError()
         if e!=ERROR_IO_PENDING:
             log("WriteFile: %s", IO_ERROR_STR.get(e, e))
             if e in CONNECTION_CLOSED_ERRORS:
                 raise ConnectionClosedException(CONNECTION_CLOSED_ERRORS[e])
         r = WaitForSingleObject(self.write_event, INFINITE)
         log("WaitForSingleObject(..)=%s, len=%i", WAIT_STR.get(r, r), written.value)
         if not self.pipe_handle:
             #closed already!
             return written.value
         if r:
             raise Exception("failed to write buffer to named pipe handle %s" % self.pipe_handle)
     if self.pipe_handle:
         if not GetOverlappedResult(self.pipe_handle, byref(self.write_overlapped), byref(written), False):
             e = GetLastError()
             raise Exception("overlapped write failed: %s" % IO_ERROR_STR.get(e, e))
         log("pipe_write: %i bytes written", written.value)
         if self.pipe_handle:
             FlushFileBuffers(self.pipe_handle)
     #SetFilePointer(self.pipe_handle, 0, FILE_BEGIN)
     return written.value
示例#4
0
 def can_retry(self, e):
     code = e.args[0]
     if code == errno.WSAEWOULDBLOCK:  #@UndefinedVariable pylint: disable=no-member
         return "WSAEWOULDBLOCK"
     #convert those to a connection closed:
     closed = CONNECTION_CLOSED_ERRORS.get(code)
     if closed:
         raise ConnectionClosedException(e)
     return False
示例#5
0
def can_retry(e):
    if isinstance(e, socket.timeout):
        return "socket.timeout"
    if isinstance(e, BrokenPipeError):
        raise ConnectionClosedException(e) from None
    if isinstance(e, OSError):
        if isinstance(e, CAN_RETRY_EXCEPTIONS):
            return str(e)

        code = e.args[0]
        abort = ABORT.get(code, code)
        if abort is not None:
            err = getattr(e, "errno", None)
            log("can_retry: %s, args=%s, errno=%s, code=%s, abort=%s", type(e),
                e.args, err, code, abort)
            raise ConnectionClosedException(e) from None
    if isinstance(e, CLOSED_EXCEPTIONS):
        raise ConnectionClosedException(e) from None
    return False
示例#6
0
def can_retry(e):
    if isinstance(e, socket.timeout):
        return "socket.timeout"
    if isinstance(e, (IOError, OSError)):
        global CONTINUE_ERRNO
        code = e.args[0]
        can_continue = CONTINUE_ERRNO.get(code)
        if can_continue:
            return can_continue

        abort = ABORT.get(code, code)
        if abort is not None:
            errno = getattr(e, "errno", None)
            log("can_retry: %s, args=%s, errno=%s, code=%s, abort=%s", type(e),
                e.args, errno, code, abort)
            raise ConnectionClosedException(e)
    return False
示例#7
0
def can_retry(e):
    continue_exception = CONTINUE_EXCEPTIONS.get(type(e))
    if continue_exception:
        return continue_exception
    if isinstance(e, (IOError, OSError)):
        global CONTINUE
        code = e.args[0]
        can_continue = CONTINUE.get(code)
        if can_continue:
            return can_continue

        abort = ABORT.get(code, code)
        if abort is not None:
            log("untilConcludes: %s, args=%s, code=%s, abort=%s", type(e),
                e.args, code, abort)
            raise ConnectionClosedException(e)
    return False
示例#8
0
 def abort_test(self, action):
     p = self.process
     if p is None or p.poll():
         raise ConnectionClosedException("cannot %s: subprocess has terminated" % action)