'Get a socket from the pool. Use with a "with" statement.
Returns a :class:`SocketInfo` object wrapping a connected
:class:`socket.socket`.
This method should always be used in a with-statement::
with pool.get_socket(credentials, checkout) as socket_info:
socket_info.send_message(msg)
data = socket_info.receive_message(op_code, request_id)
The socket is logged in or out as needed to match ``all_credentials``
using the correct authentication mechanism for the server\'s wire
protocol version.
Can raise ConnectionFailure or OperationFailure.
:Parameters:
- `all_credentials`: dict, maps auth source to MongoCredential.
- `checkout` (optional): keep socket checked out.'

@contextlib.contextmanager
def get_socket(self, all_credentials, checkout=False):

    sock_info = self._get_socket_no_auth()
    try:
        sock_info.check_auth(all_credentials)
        (yield sock_info)
    except:
        self.return_socket(sock_info)
        raise
    else:
        if (not checkout):
            self.return_socket(sock_info)
