wsaapi.c
来自「linux下简单对象应用协议的开发库」· C语言 代码 · 共 1,166 行 · 第 1/3 页
C
1,166 行
{ return soap_wsa_fault_subcode(soap, 1, NULL, faultstring, faultdetail);}/**@fn int soap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail)@brief Sets receiver SOAP Fault for server fault response.@param soap context@param[in] faultstring fault string@param[in] faultdetail detail string@return SOAP_FAULT*/intsoap_wsa_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail){ return soap_wsa_fault_subcode(soap, 0, NULL, faultstring, faultdetail);}/******************************************************************************\ * * WS-Addressing Fault *\******************************************************************************/#if defined(SOAP_WSA_2005)/**@fn int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, char **info)@brief Checks the presence of a WS-Addressing fault@param soap context@param[out] fault code@param[out] info string pointer related to the wsa fault (or set to NULL)@return SOAP_OK (no fault) or fault code*/intsoap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultCodesType) *fault, char **info){ if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = *soap_faultsubcode(soap); if (code) { SOAP_WSA__(soap_s2,FaultCodesType)(soap, code, fault); if (info) { struct SOAP_ENV__Detail *detail; *info = NULL; if (soap->fault->detail) detail = soap->fault->detail; else detail = soap->fault->SOAP_ENV__Detail; if (detail) { switch (detail->__type) { case SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName): case SOAP_WSA_(SOAP_TYPE_,ProblemIRI): *info = (char*)detail->fault; break; case SOAP_WSA_(SOAP_TYPE_,ProblemAction): *info = ((SOAP_WSA_(,ProblemAction)*)detail->fault)->Action; break; default: break; } } } return soap->error; } } return SOAP_OK;}#elif defined(SOAP_WSA_2003)intsoap_wsa_check_fault(struct soap *soap, char **fault){ struct SOAP_ENV__Detail detail; *fault = NULL; if (soap->error && soap->fault) { if (soap->fault->detail) detail = soap->fault->detail; else detail = soap->fault->SOAP_ENV__Detail; } if (detail) { *fault = detail->__any; if (*fault) return soap->error; } return SOAP_OK;}#else/**@fn int soap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault)@brief Checks the presence of a WS-Addressing fault@param soap context@param[out] fault code@return SOAP_OK (no fault) or fault code*/intsoap_wsa_check_fault(struct soap *soap, SOAP_WSA(FaultSubcodeValues) *fault){ if (soap->error && soap->fault && soap->fault->SOAP_ENV__Code) { const char *code = *soap_faultsubcode(soap); if (code) { SOAP_WSA__(soap_s2,FaultSubcodeValues)(soap, code, fault); return soap->error; } } return SOAP_OK;}#endif#if defined(SOAP_WSA_2005)/**@fn int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info)@brief Sets SOAP Fault (sub)code for server WS-Addressing fault response.@param soap context@param[in] fault is one of wsa:FaultCodesType enumeration values@param[in] info is the value of the element in the Fault detail field@return SOAP_FAULT*/intsoap_wsa_error(struct soap *soap, SOAP_WSA(FaultCodesType) fault, const char *info){ const char *code = SOAP_WSA_(soap,FaultCodesType2s)(soap, fault); /* populate the SOAP Fault as per WS-Addressing spec */ switch (fault) { case SOAP_WSA(InvalidAddressingHeader): soap_wsa_sender_fault_subcode(soap, code, "A header representing a Message Addressing Property is not valid and the message cannot be processed.", NULL); soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } break; case SOAP_WSA(InvalidAddress): soap_wsa_sender_fault_subcode(soap, code, "Invalid address.", NULL); break; case SOAP_WSA(InvalidEPR): soap_wsa_sender_fault_subcode(soap, code, "Invalid EPR.", NULL); break; case SOAP_WSA(InvalidCardinality): soap_wsa_sender_fault_subcode(soap, code, "Invalid cardinality of headers.", NULL); break; case SOAP_WSA(MissingAddressInEPR): soap_wsa_sender_fault_subcode(soap, code, "Missing EPR address.", NULL); break; case SOAP_WSA(DuplicateMessageID): soap_wsa_sender_fault_subcode(soap, code, "Message contains the message ID of a message already received.", NULL); break; case SOAP_WSA(ActionMismatch): soap_wsa_sender_fault_subcode(soap, code, "Action and SOAP action of the message do not match.", NULL); break; case SOAP_WSA(MessageAddressingHeaderRequired): soap_wsa_sender_fault_subcode(soap, code, "A required header representing a Message Addressing Property is not present.", NULL); soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemHeaderQName); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } break; case SOAP_WSA(DestinationUnreachable): soap_wsa_sender_fault_subcode(soap, code, "No route can be determined to reach [destination]", NULL); soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } break; case SOAP_WSA(ActionNotSupported): soap_wsa_sender_fault_subcode(soap, code, "The [action] cannot be processed at the receiver.", NULL); soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemAction); soap->fault->detail->fault = (void*)soap_malloc(soap, sizeof(SOAP_WSA_(,ProblemAction))); SOAP_WSA_(soap_default_,ProblemAction)(soap, (SOAP_WSA_(,ProblemAction)*)soap->fault->detail->fault); ((SOAP_WSA_(,ProblemAction)*)soap->fault->detail->fault)->Action = (char*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemAction); soap->fault->SOAP_ENV__Detail->fault = (void*)soap_malloc(soap, sizeof(SOAP_WSA_(,ProblemAction))); SOAP_WSA_(soap_default_,ProblemAction)(soap, (SOAP_WSA_(,ProblemAction)*)soap->fault->SOAP_ENV__Detail->fault); ((SOAP_WSA_(,ProblemAction)*)soap->fault->SOAP_ENV__Detail->fault)->Action = (char*)info; } break; case SOAP_WSA(EndpointUnavailable): soap_wsa_receiver_fault_subcode(soap, code, "The endpoint is unable to process the message at this time.", NULL); soap_faultdetail(soap); if (soap->version == 1) { soap->fault->detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->detail->fault = (void*)info; } else { soap->fault->SOAP_ENV__Detail->__type = SOAP_WSA_(SOAP_TYPE_,ProblemIRI); soap->fault->SOAP_ENV__Detail->fault = (void*)info; } break; default: break; } return SOAP_FAULT;}#elif defined(SOAP_WSA_2003)intsoap_wsa_error(struct soap *soap, const char *fault){ return soap_wsa_sender_fault_subcode(soap, NULL, fault, NULL);}#else/**@fn int soap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault)@brief Sets SOAP Fault (sub)code for server WS-Addressing fault response.@param soap context@param[in] fault is one of wsa:FaultSubcodeValues@return SOAP_FAULT*/intsoap_wsa_error(struct soap *soap, SOAP_WSA(FaultSubcodeValues) fault){ const char *code = SOAP_WSA_(soap,FaultSubcodeValues2s)(soap, fault); /* populate the SOAP Fault as per WS-Addressing spec */ switch (fault) { case SOAP_WSA(InvalidMessageInformationHeader): return soap_wsa_sender_fault_subcode(soap, code, "A message information header is not valid and the message cannot be processed. The validity failure can be either structural or semantic, e.g. a [destination] that is not a URI or a [relationship] to a [message id] that was never issued.", "Invalid header"); case SOAP_WSA(MessageInformationHeaderRequired): return soap_wsa_sender_fault_subcode(soap, code, "A required message information header, To, MessageID, or Action, is not present.", "Missing Header QName"); case SOAP_WSA(DestinationUnreachable): return soap_wsa_sender_fault_subcode(soap, code, "No route can be determined to reach the destination role defined by the WS-Addressing To.", NULL); case SOAP_WSA(ActionNotSupported): return soap_wsa_sender_fault_subcode(soap, code, "The [action] cannot be processed at the receiver.", soap->action); case SOAP_WSA(EndpointUnavailable): return soap_wsa_receiver_fault_subcode(soap, code, "The endpoint is unable to process the message at this time.", NULL); default: break; } return SOAP_FAULT;}#endif/******************************************************************************\ * * Plugin registry functions *\******************************************************************************//**@fn int soap_wsa(struct soap *soap, struct soap_plugin *p, void *arg)@brief Plugin registry function, used with soap_register_plugin.@param soap context@param[in,out] p plugin created in registry@param[in] arg passed from soap_register_plugin_arg@return SOAP_OK*/intsoap_wsa(struct soap *soap, struct soap_plugin *p, void *arg){ DBGFUN("soap_wsa"); p->id = soap_wsa_id; p->data = (void*)SOAP_MALLOC(soap, sizeof(struct soap_wsa_data)); p->fcopy = NULL; p->fdelete = soap_wsa_delete; if (p->data) { if (soap_wsa_init(soap, (struct soap_wsa_data*)p->data)) { SOAP_FREE(soap, p->data); return SOAP_EOM; } } return SOAP_OK;}/**@fn int soap_wsa_init(struct soap *soap, struct soap_wsa_data *data)@brief Initializes plugin data.@param soap context@param[in,out] data plugin data@return SOAP_OK*/static intsoap_wsa_init(struct soap *soap, struct soap_wsa_data *data){ DBGFUN("soap_wsa_init"); data->fheader = soap->fheader; data->fseterror = soap->fseterror; soap->fheader = soap_wsa_header; soap->fseterror = soap_wsa_set_error; return SOAP_OK;}/**@fn void soap_wsa_delete(struct soap *soap, struct soap_plugin *p)@brief Deletes plugin data.@param soap context@param[in,out] p plugin@return SOAP_OK*/static voidsoap_wsa_delete(struct soap *soap, struct soap_plugin *p){ DBGFUN("soap_wsa_delete"); SOAP_FREE(soap, p->data);}/******************************************************************************\ * * Callbacks registered by plugin *\******************************************************************************//**@fn int soap_wsa_header(struct soap *soap)@brief Copies WS-Addressing action to SOAP action@param soap context@return SOAP_OK or faultThis callback is invoked to copy the WS-Addressing action to the SOAP actionbefore invoking the service operation.*/static intsoap_wsa_header(struct soap *soap){ struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN("soap_wsa_header"); if (!data) return SOAP_PLUGIN_ERROR; if (data->fheader && data->fheader(soap)) return soap->error; if (soap->header && soap->header->SOAP_WSA(Action)) soap->action = soap->header->SOAP_WSA(Action); return SOAP_OK;}/**@fn void soap_wsa_set_error(struct soap *soap, const char **c, const char **s)@brief Copies WS-Addressing action to SOAP action@param soap context@param c fault code@param s fault string*/static voidsoap_wsa_set_error(struct soap *soap, const char **c, const char **s){ struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN("soap_wsa_set_error"); if (!data) return; if (data->fseterror) data->fseterror(soap, c, s); if (soap->error == SOAP_NO_METHOD) {#if defined(SOAP_WSA_2005) soap->error = soap_wsa_error(soap, SOAP_WSA(ActionNotSupported), soap->action);#elif defined(SOAP_WSA_2003) soap->error = soap_wsa_error(soap, "Action not supported");#else soap->error = soap_wsa_error(soap, SOAP_WSA(ActionNotSupported));#endif }}/**@fn int soap_wsa_response(struct soap *soap, int status, size_t count)@brief Overrides the HTTP response operations to send an HTTP POST@param soap context@param status code@param count message length (if non-chunked)*/static intsoap_wsa_response(struct soap *soap, int status, size_t count){ struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id); DBGFUN2("soap_wsa_response", "status=%d", status, "count=%lu", (unsigned long)count); if (!data) return SOAP_PLUGIN_ERROR; soap->fresponse = data->fresponse; /* reset (HTTP response) */ return soap->fpost(soap, soap_strdup(soap, soap->endpoint), soap->host, soap->port, soap->path, soap->action, count);}/******************************************************************************\ * * Misc. *\******************************************************************************//**@fn int soap_wsa_alloc_header(struct soap *soap)@brief Adds SOAP Header if not present.@param soap context@return SOAP_OK*/static intsoap_wsa_alloc_header(struct soap *soap){ soap_header(soap); return SOAP_OK;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?