@@ -359,7 +359,7 @@ def __init__(self, sock=None, keyfile=None, certfile=None,
359359 # set options
360360 self .do_handshake_on_connect = do_handshake_on_connect
361361 self .suppress_ragged_eofs = suppress_ragged_eofs
362- self .server_side = server_side
362+ self ._server_side = server_side
363363
364364 # save socket
365365 self ._sock = sock
@@ -447,13 +447,22 @@ def _release_native_object(self):
447447 _lib .wolfSSL_free (self .native_object )
448448 self .native_object = _ffi .NULL
449449
450+ def pending (self ):
451+ return _lib .wolfSSL_pending (self .native_object )
452+
450453 @property
451454 def context (self ):
452455 """
453456 Returns the context used by this object.
454457 """
455458 return self ._context
456459
460+ def server_side (self ):
461+ """
462+ Returns True for server-side socket, otherwise False.
463+ """
464+ return self ._server_side ;
465+
457466 def dup (self ):
458467 raise NotImplementedError ("Can't dup() %s instances" %
459468 self .__class__ .__name__ )
@@ -615,7 +624,7 @@ def shutdown(self, how):
615624 if self .native_object != _ffi .NULL :
616625 _lib .wolfSSL_shutdown (self .native_object )
617626 self ._release_native_object ()
618- socket . shutdown ( self ._sock , how )
627+ self ._sock . shutdown ( how )
619628
620629 def unwrap (self ):
621630 """
@@ -634,17 +643,14 @@ def unwrap(self):
634643
635644 return sock
636645
637- def close (self ):
638- self ._sock .close ()
639-
640646 def do_handshake (self , block = False ): # pylint: disable=unused-argument
641647 """
642648 Perform a TLS/SSL handshake.
643649 """
644650 self ._check_closed ("do_handshake" )
645651 self ._check_connected ()
646652
647- if self .server_side :
653+ if self ._server_side :
648654 ret = _lib .wolfSSL_accept (self .native_object )
649655 else :
650656 ret = _lib .wolfSSL_connect (self .native_object )
@@ -687,7 +693,7 @@ def do_handshake(self, block=False): # pylint: disable=unused-argument
687693 (err , eStr ))
688694
689695 def _real_connect (self , addr , connect_ex ):
690- if self .server_side :
696+ if self ._server_side :
691697 raise ValueError ("can't connect in server-side mode" )
692698
693699 # Here we assume that the socket is client-side, and not
@@ -696,10 +702,10 @@ def _real_connect(self, addr, connect_ex):
696702 raise ValueError ("attempt to connect already-connected SSLSocket!" )
697703
698704 if connect_ex :
699- err = socket . connect_ex ( self ._sock , addr )
705+ err = self ._sock . connect_ex ( addr )
700706 else :
701707 err = 0
702- socket . connect ( self ._sock , addr )
708+ self ._sock . connect ( addr )
703709
704710 if err == 0 :
705711 self ._connected = True
@@ -728,10 +734,10 @@ def accept(self):
728734 containing that new connection wrapped with a server-side secure
729735 channel, and the address of the remote client.
730736 """
731- if not self .server_side :
737+ if not self ._server_side :
732738 raise ValueError ("can't accept in client-side mode" )
733739
734- newsock , addr = socket . accept ( self ._sock )
740+ newsock , addr = self ._sock . accept ( )
735741 newsock = self .context .wrap_socket (
736742 newsock ,
737743 do_handshake_on_connect = self .do_handshake_on_connect ,
@@ -767,6 +773,43 @@ def getpeercert(self, binary_form=False):
767773 return {'subject' : ((('commonName' , x509 .get_subject_cn ()),),),
768774 'subjectAltName' : x509 .get_altnames () }
769775
776+ # The following functions expose functionality of the underlying
777+ # Socket object. These are also expsed through Python's ssl module
778+ # API and are provided here for compatibility.
779+ def close (self ):
780+ self ._sock .close ()
781+
782+ def fileno (self ):
783+ """
784+ Return file descriptor of underlying socket.
785+ """
786+ return self ._sock .fileno ()
787+
788+ def gettimeout (self ):
789+ """
790+ Return the socket timeout of the underlying wrapped socket
791+ """
792+ return self ._sock .gettimeout ()
793+
794+ def settimeout (self , timeout ):
795+ """
796+ Set the timeout on the underlying wrapped socket
797+ """
798+ self ._sock .settimeout (timeout )
799+
800+ def getpeername (self ):
801+ """
802+ Return the remote address that the underlying socket is connected to
803+ """
804+ return self ._sock .getpeername ()
805+
806+ def getsockname (self ):
807+ """
808+ Return the underlying socket's address
809+ """
810+ return self ._sock .getsockname ()
811+
812+
770813
771814def wrap_socket (sock , keyfile = None , certfile = None , server_side = False ,
772815 cert_reqs = CERT_NONE , ssl_version = PROTOCOL_TLS , ca_certs = None ,
0 commit comments