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 + -
显示快捷键?