import ssl

from ctypes import *

def getErrorStrFromQueue():
    code = ssl.dll.ERR_get_error()
    assert code != 0, "No error when we expected one"
    ssl.dll.ERR_lib_error_string.restype = c_char_p
    ssl.dll.ERR_func_error_string.restype = c_char_p
    ssl.dll.ERR_reason_error_string = c_char_p
    return ', '.join([
        ssl.dll.ERR_lib_error_string(code),
        ssl.dll.ERR_func_error_string(code),
        ssl.dll.ERR_reason_error_string(code),])

class MemoryBIO:
    def __init__(self):
        self._dll = ssl.dll
        self._bio = self._dll.BIO_new(self._dll.BIO_s_mem())
    
    def __del__(self):
        self._dll.BIO_free(self._bio)
        del self._dll

    def get_bio(self):
        return self._bio
    _as_parameter_ = property(get_bio)
    
    def __str__(self):
        size = self._dll.BIO_ctrl_pending(self._bio)
        buf = c_buffer(size)
        self._dll.BIO_read(self._bio, byref(buf), size)
        return buf.raw
    