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; }
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; }