Example #1
0
herror_t
soap_env_new_with_fault(fault_code_t faultcode,
                        const char *faultstring,
                        const char *faultactor, const char *detail,
                        SoapEnv ** out)
{
  xmlDocPtr doc;
  herror_t err;

  doc = soap_fault_build(faultcode, faultstring, faultactor, detail);
  if (doc == NULL)
    return herror_new("soap_env_new_with_fault",
                      XML_ERROR_PARSE, "Can not parse fault xml");

  if ((err = soap_env_new_from_doc(doc, out)) != H_OK)
  {
    xmlFreeDoc(doc);
  }

  return err;
}
Example #2
0
xmlDocPtr
soap_fault_build(int fault_code, const char *fault_string, const char *fault_actor, const char *detail)
{

  /* variables */
  const char *faultcode;
  int bufferlen = 2000;
  char *buffer;
  xmlDocPtr fault;              /* result */

  log_verbose("Build fault");

  switch (fault_code)
  {
  case SOAP_FAULT_VERSION_MISMATCH:
    faultcode = fault_vm;
    break;
  case SOAP_FAULT_MUST_UNDERSTAND:
    faultcode = fault_mu;
    break;
  case SOAP_FAULT_DATA_ENCODING_UNKOWN:
    faultcode = fault_deu;
    break;
  case SOAP_FAULT_RECEIVER:
    faultcode = fault_server;
    break;
  case SOAP_FAULT_SENDER:
  default:
    faultcode = fault_client;
    break;
  }

  /* calculate buffer length */
  if (fault_string)
    bufferlen += strlen(fault_string);
  if (fault_actor)
    bufferlen += strlen(fault_actor);
  if (detail)
    bufferlen += strlen(detail);

  log_verbose("Creating buffer with %d bytes", bufferlen);
  if (!(buffer = (char *) malloc(bufferlen)))
  {
    log_error("malloc failed (%s)", errno);
    return NULL;
  }

  sprintf(buffer, _SOAP_FAULT_TEMPLATE_,
          soap_env_ns, soap_env_enc, soap_xsi_ns,
          soap_xsd_ns, faultcode,
          fault_string ? fault_string : "error",
          fault_actor ? fault_actor : "", detail ? detail : "");

  fault = xmlParseDoc(BAD_CAST buffer);
  free(buffer);

  if (fault == NULL)
  {
    log_error("Cannot create XML document!");

    return soap_fault_build(fault_code, "Cannot create fault object in XML", soap_server_get_name(), NULL);
  }

  log_verbose("Returning fault (%p)", fault);
  return fault;
}