def send_message(self, message):
        # TODO current implementation does negotiation on each HTTP request
        # which is not efficient
        # TODO support kerberos session with message encryption
        krb_ticket = KerberosTicket(self.krb_service)
        headers = {'Authorization': krb_ticket.auth_header,
                   'Connection': 'Keep-Alive',
                   'Content-Type': 'application/soap+xml;charset=UTF-8',
                   'User-Agent': 'Python WinRM client'}

        request = Request(self.endpoint, data=message, headers=headers)
        try:
            urlopen_kwargs = dict(timeout=self.timeout)
            # it's an error to pass context to non-SSLContext aware urlopen (pre-2.7.9), so don't...
            if(self.scheme=='https' and self.sslcontext):
                urlopen_kwargs['context'] = self.sslcontext

            response = urlopen(request, **urlopen_kwargs)
            krb_ticket.verify_response(response.headers['WWW-Authenticate'])
            response_text = response.read()
            return response_text
        except __HOLE__ as ex:
            response_text = ex.read()
            # Per http://msdn.microsoft.com/en-us/library/cc251676.aspx rule 3,
            # should handle this 500 error and retry receiving command output.
            if 'http://schemas.microsoft.com/wbem/wsman/1/windows/shell/Receive' in message and 'Code="2150858793"' in response_text:  # NOQA
                return response_text
            # if ex.code == 401 and ex.headers['WWW-Authenticate'] == \
            #    'Negotiate, Basic realm="WSMAN"':
            error_message = 'Kerberos-based authentication was failed. ' \
                            'Code {0}'.format(ex.code)
            if ex.msg:
                error_message += ', {0}'.format(ex.msg)
            raise WinRMTransportError('kerberos', error_message)
        except URLError as ex:
            raise WinRMTransportError('kerberos', ex.reason)
dataset/ETHPy150Open diyan/pywinrm/winrm/transport.py/HttpKerberos.send_message