blob: a560bf8537364001ff361c3fd3b77d84b12d1f51 [file] [log] [blame]
/*
udpserver.c
SOAP-over-UDP demo server
--------------------------------------------------------------------------------
gSOAP XML Web services tools
Copyright (C) 2001-2004, Robert van Engelen, Genivia, Inc. All Rights Reserved.
This software is released under one of the following two licenses:
GPL or Genivia's license for commercial use.
--------------------------------------------------------------------------------
GPL license.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
Author contact information:
engelen@genivia.com / engelen@acm.org
--------------------------------------------------------------------------------
A commercial use license is available from Genivia, Inc., contact@genivia.com
--------------------------------------------------------------------------------
*/
#include "soapH.h"
#include "udp.nsmap"
#define MAX_HISTORY (1000)
char *received_id[MAX_HISTORY];
int last_received;
void init_received();
int check_received(const char *id);
int id_count = 1;
int main()
{ struct soap soap;
init_received();
soap_init1(&soap, SOAP_IO_UDP);
if (!soap_valid_socket(soap_bind(&soap, NULL, 10000, 100)))
{ soap_print_fault(&soap, stderr);
exit(1);
}
for (;;)
{ printf("Accepting requests...\n");
if (soap_serve(&soap))
soap_print_fault(&soap, stderr);
soap_end(&soap);
}
soap_done(&soap);
return 0;
}
void init_received()
{ int i;
for (i = 0; i < MAX_HISTORY; i++)
received_id[i] = NULL;
last_received = 0;
}
int check_received(const char *id)
{ int i;
if (!id)
return 1;
/* Check if Message ID already received */
for (i = 0; i < MAX_HISTORY; i++)
{ if (received_id[i] && !strcmp(id, received_id[i]))
return 1;
}
if (received_id[last_received])
free(received_id[last_received]);
received_id[last_received++] = strdup(id);
/* Wrap to overwrite old IDs */
if (last_received >= MAX_HISTORY)
last_received = 0;
return 0;
}
int check_header(struct soap *soap)
{ /* MUST have received a SOAP Header */
if (!soap->header)
return soap_sender_fault(soap, "No SOAP header", NULL);
/* ... with a Message ID */
if (!soap->header->wsa__MessageID)
return soap_sender_fault(soap, "No WS-Addressing MessageID", NULL);
soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship));
soap_default_wsa__Relationship(soap, soap->header->wsa__RelatesTo);
soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID;
return SOAP_OK;
}
int ns__echoString(struct soap *soap, char *str, char **res)
{ /* Get Header info and setup response Header */
if (check_header(soap))
{ printf("Malformed header\n");
return SOAP_FAULT; /* there was a problem */
}
/* If message with MessageID already received, ignore it */
if (check_received(soap->header->wsa__MessageID))
{ printf("Request message %s already received\n", soap->header->wsa__MessageID);
return SOAP_STOP;
}
printf("Request message %s accepted\n", soap->header->wsa__MessageID);
/* Check ReplyTo has Address */
if (!soap->header->wsa__ReplyTo || !soap->header->wsa__ReplyTo->Address)
return soap_sender_fault(soap, "No WS-Addressing ReplyTo address", NULL);
/* Copy Header info into response Header */
soap->header->wsa__To = soap->header->wsa__ReplyTo->Address;
/* Add info to response Header */
soap->header->wsa__MessageID = soap_strdup(soap, soap_int2s(soap, id_count++));
soap->header->wsa__Action = "http://genivia.com/udp/echoStringResponse";
/* Copy request string into response string */
printf("Response message %s returned\n", soap->header->wsa__MessageID);
*res = str;
return SOAP_OK;
}
int ns__sendString(struct soap *soap, char *str)
{ if (check_header(soap))
printf("Malformed header\n");
else if (check_received(soap->header->wsa__MessageID))
printf("One-way message %s already received\n", soap->header->wsa__MessageID);
else
printf("One-way message %s accepted and serviced\n", soap->header->wsa__MessageID);
return SOAP_OK;
}