code: def operation(self, url, idp_entity_id, op, **opargs):
          
          sp_url = self._sp
  
          # ********************************************
          # Phase 1 - First conversation with the SP
          # ********************************************
          # headers needed to indicate to the SP that I'm ECP enabled
  
          opargs["headers"] = self.add_paos_headers(opargs["headers"])
          response = self.send(sp_url, op, **opargs)
          logger.debug("[Op] SP response: %s" % response)
          print(response.text)
  
          if response.status_code != 200:
              raise SAMLError(
                  "Request to SP failed: %s" % response.text)
  
          # The response might be a AuthnRequest instance in a SOAP envelope
          # body. If so it's the start of the ECP conversation
          # Two SOAP header blocks; paos:Request and ecp:Request
          # may also contain a ecp:RelayState SOAP header block
          # If channel-binding was part of the PAOS header any number of
          # <cb:ChannelBindings> header blocks may also be present
          # if 'holder-of-key' option then one or more <ecp:SubjectConfirmation>
          # header blocks may also be present
          try:
              respdict = self.parse_soap_message(response.text)
              self.ecp_conversation(respdict, idp_entity_id)
  
              # should by now be authenticated so this should go smoothly
              response = self.send(url, op, **opargs)
          except (soap.XmlParseError, AssertionError, KeyError):
              raise
  
          if response.status_code >= 400:
              raise SAMLError("Error performing operation: %s" % (
                  response.text,))
  
          return response
docs: This is the method that should be used by someone that wants
          to authenticate using SAML ECP
  
          :param url: The page that access is sought for
          :param idp_entity_id: The entity ID of the IdP that should be
              used for authentication
          :param op: Which HTTP operation (GET/POST/PUT/DELETE)
          :param opargs: Arguments to the HTTP call
          :return: The page