blob: d2bcbefcd9d70af5ea1cc0380c19e50f49336602 [file] [log] [blame]
/*
mtom-test.c
This application includes a MTOM test client and server. As a client
application, it fires four different base64 or MTOM attachments to the server.
As a server, it will respond to the messages by converting base64 into MTOM
attachments and vice versa.
Usage (server):
mtom-test <port>
Usage (client):
mtom-test http://localhost:<port> "<message>" "<MIME-type>"
Usage (client):
mtom-test http://localhost:<port> "<message>" "<MIME-type>" "<message2>" "<message3>" ...
--------------------------------------------------------------------------------
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 "mtom_test.nsmap"
int cgi_serve();
int run_serve(int port);
int run_tests(int,char**);
int main(int argc, char **argv)
{ if (argc < 2)
return cgi_serve();
if (argc < 3)
return run_serve(atoi(argv[1]));
return run_tests(argc, argv);
}
int cgi_serve()
{ /* CGI-style: serve request from stdin */
return soap_serve(soap_new1(SOAP_ENC_MTOM)); /* enable MTOM XOP attachments */
}
int run_serve(int port)
{ struct soap *soap = soap_new1(SOAP_ENC_MTOM);
int ret;
if (!soap_valid_socket(soap_bind(soap, NULL, port, 100)))
soap_print_fault(soap, stderr);
else
{ fprintf(stderr, "Bind to port %d successful\n", port);
soap->accept_timeout = 3600; /* let server time out after one hour */
for (;;)
{ int sock = soap_accept(soap);
if (!soap_valid_socket(sock))
{ if (soap->errnum)
soap_print_fault(soap, stderr);
else
{ fprintf(stderr, "Server timed out\n");
break;
}
}
fprintf(stderr, "Accepting socket %d connection from IP %d.%d.%d.%d... ", sock, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF);
if (soap_serve(soap))
soap_print_fault(soap, stderr);
fprintf(stderr, "done\n");
soap_destroy(soap);
soap_end(soap);
}
}
ret = soap->error;
soap_done(soap);
free(soap);
return ret;
}
int run_tests(int argc, char **argv)
{ struct soap *soap = soap_new1(SOAP_ENC_MTOM);
int i, ret;
struct x__DataType data;
struct x__WrapperType wrap;
struct __m__EchoTestSingleResponse single;
struct __m__EchoTestMultipleResponse multiple;
soap_default_x__DataType(soap, &data);
soap_default_x__WrapperType(soap, &wrap);
/* First test call */
data.__union = SOAP_UNION_x__data_base64;
data.choice.base64.__ptr = (unsigned char*)argv[2];
data.choice.base64.__size = (int)strlen(argv[2]) + 1;
if (argc > 3)
data.xmlmime__contentType = argv[3];
if (soap_call___m__EchoTestSingle(soap, argv[1], NULL, &data, &single))
soap_print_fault(soap, stderr);
else
{ if (!single.x__Data || single.x__Data->__union != SOAP_UNION_x__data_xop__Include || !single.x__Data->choice.xop__Include.__ptr || single.x__Data->choice.xop__Include.__size != data.choice.base64.__size || strcmp((char*)single.x__Data->choice.xop__Include.__ptr, (char*)data.choice.base64.__ptr))
fprintf(stderr, "EchoTestSingle 1: data transcription error\n");
else
fprintf(stderr, "EchoTestSingle 1: OK\n");
/* Second test call */
data.__union = SOAP_UNION_x__data_xop__Include;
data.choice.xop__Include.__ptr = (unsigned char*)argv[2];
data.choice.xop__Include.__size = (int)strlen(argv[2]) + 1;
data.choice.xop__Include.id = NULL;
data.choice.xop__Include.type = "text/xml; charset=utf-8";
data.choice.xop__Include.options = NULL;
if (soap_call___m__EchoTestSingle(soap, argv[1], NULL, &data, &single))
soap_print_fault(soap, stderr);
else
{ if (!single.x__Data
|| single.x__Data->__union != SOAP_UNION_x__data_base64
|| !single.x__Data->choice.base64.__ptr
|| single.x__Data->choice.base64.__size != data.choice.xop__Include.__size
|| strcmp((char*)single.x__Data->choice.base64.__ptr, (char*)data.choice.xop__Include.__ptr))
fprintf(stderr, "EchoTestSingle 2: data transcription error\n");
else
{ fprintf(stderr, "EchoTestSingle 2: OK\n");
/* Third test call */
wrap.__size = argc - 2;
wrap.Data = (struct x__DataType*)soap_malloc(soap, wrap.__size * sizeof(struct x__DataType));
for (i = 0; i < wrap.__size; ++i)
{ soap_default_x__DataType(soap, &wrap.Data[i]);
wrap.Data[i].__union = SOAP_UNION_x__data_base64;
wrap.Data[i].choice.base64.__ptr = (unsigned char*)argv[i + 2];
wrap.Data[i].choice.base64.__size = (int)strlen(argv[i + 2]) + 1;
wrap.Data[i].xmlmime__contentType = "text/xml";
}
if (soap_call___m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple))
soap_print_fault(soap, stderr);
else
{ int okay = 1;
if (!multiple.x__EchoTest
|| multiple.x__EchoTest->__size != wrap.__size)
okay = 0;
else
{ for (i = 0; i < multiple.x__EchoTest->__size; ++i)
if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_xop__Include
|| !multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr
|| multiple.x__EchoTest->Data[i].choice.xop__Include.__size != wrap.Data[i].choice.base64.__size
|| strcmp((char*)multiple.x__EchoTest->Data[i].choice.xop__Include.__ptr, (char*)wrap.Data[i].choice.base64.__ptr))
okay = 0;
}
if (!okay)
fprintf(stderr, "EchoTestMultiple 1: data transcription error\n");
else
{ fprintf(stderr, "EchoTestMultiple 1: OK\n");
/* Fourth test call */
for (i = 0; i < wrap.__size; ++i)
{ soap_default_x__DataType(soap, &wrap.Data[i]);
wrap.Data[i].__union = SOAP_UNION_x__data_xop__Include;
wrap.Data[i].choice.xop__Include.__ptr = (unsigned char*)argv[i + 2];
wrap.Data[i].choice.xop__Include.__size = (int)strlen(argv[i + 2]) + 1;
wrap.Data[i].choice.xop__Include.id = NULL;
wrap.Data[i].choice.xop__Include.type = "text/xml";
wrap.Data[i].choice.xop__Include.options = NULL;
wrap.Data[i].xmlmime__contentType = "text/xml";
}
if (soap_call___m__EchoTestMultiple(soap, argv[1], NULL, &wrap, &multiple))
soap_print_fault(soap, stderr);
else
{ int okay = 1;
if (!multiple.x__EchoTest
|| multiple.x__EchoTest->__size != wrap.__size)
okay = 0;
else
{ for (i = 0; i < multiple.x__EchoTest->__size; ++i)
if (multiple.x__EchoTest->Data[i].__union != SOAP_UNION_x__data_base64
|| !multiple.x__EchoTest->Data[i].choice.base64.__ptr
|| multiple.x__EchoTest->Data[i].choice.base64.__size != wrap.Data[i].choice.xop__Include.__size || strcmp((char*)multiple.x__EchoTest->Data[i].choice.base64.__ptr, (char*)wrap.Data[i].choice.xop__Include.__ptr))
okay = 0;
}
if (!okay)
fprintf(stderr, "EchoTestMultiple 2: data transcription error\n");
else
fprintf(stderr, "EchoTestMultiple 2: OK\n");
}
}
}
}
}
}
ret = soap->error;
soap_destroy(soap);
soap_end(soap);
soap_done(soap);
free(soap);
return ret;
}
int __m__EchoTestSingle(struct soap *soap, struct x__DataType *data, struct __m__EchoTestSingleResponse *response)
{ if (!data)
return soap_sender_fault(soap, "No data", NULL);
/* allocate response */
response->x__Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType));
if (!response->x__Data)
return SOAP_EOM;
/* copy data into response, switching from base64 to MTOM and vice versa */
switch (data->__union)
{ case SOAP_UNION_x__data_xop__Include:
/* convert MTOM attachment to base64Binary */
response->x__Data->__union = SOAP_UNION_x__data_base64;
response->x__Data->choice.base64.__ptr = data->choice.xop__Include.__ptr;
response->x__Data->choice.base64.__size = data->choice.xop__Include.__size;
response->x__Data->xmlmime__contentType = data->choice.xop__Include.type;
break;
case SOAP_UNION_x__data_base64:
/* convert base64Binary to MTOM attachment */
response->x__Data->__union = SOAP_UNION_x__data_xop__Include;
response->x__Data->choice.xop__Include.__ptr = data->choice.base64.__ptr;
response->x__Data->choice.xop__Include.__size = data->choice.base64.__size;
response->x__Data->choice.xop__Include.id = NULL;
response->x__Data->choice.xop__Include.type = data->xmlmime__contentType;
response->x__Data->choice.xop__Include.options = NULL;
response->x__Data->xmlmime__contentType = data->xmlmime__contentType;
break;
default:
return soap_sender_fault(soap, "Wrong data format", NULL);
}
return SOAP_OK;
}
int __m__EchoTestMultiple(struct soap *soap, struct x__WrapperType *x__EchoTest, struct __m__EchoTestMultipleResponse *response)
{ int i;
if (!x__EchoTest)
return soap_sender_fault(soap, "No data", NULL);
/* allocate response */
response->x__EchoTest = (struct x__WrapperType*)soap_malloc(soap, sizeof(struct x__WrapperType));
if (!response->x__EchoTest)
return SOAP_EOM;
response->x__EchoTest->__size = x__EchoTest->__size;
response->x__EchoTest->Data = (struct x__DataType*)soap_malloc(soap, sizeof(struct x__DataType) * x__EchoTest->__size);
if (!response->x__EchoTest->Data)
return SOAP_EOM;
/* copy data into response, switching from base64 to MTOM and vice versa */
for (i = 0; i < x__EchoTest->__size; ++i)
{ switch (x__EchoTest->Data[i].__union)
{ case SOAP_UNION_x__data_xop__Include:
/* convert MTOM attachment to base64Binary */
response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_base64;
response->x__EchoTest->Data[i].choice.base64.__ptr = x__EchoTest->Data[i].choice.xop__Include.__ptr;
response->x__EchoTest->Data[i].choice.base64.__size = x__EchoTest->Data[i].choice.xop__Include.__size;
response->x__EchoTest->Data[i].xmlmime__contentType = x__EchoTest->Data[i].choice.xop__Include.type;
break;
case SOAP_UNION_x__data_base64:
/* convert base64Binary to MTOM attachment */
response->x__EchoTest->Data[i].__union = SOAP_UNION_x__data_xop__Include;
response->x__EchoTest->Data[i].choice.xop__Include.__ptr = x__EchoTest->Data[i].choice.base64.__ptr;
response->x__EchoTest->Data[i].choice.xop__Include.__size = x__EchoTest->Data[i].choice.base64.__size;
response->x__EchoTest->Data[i].choice.xop__Include.id = NULL;
response->x__EchoTest->Data[i].choice.xop__Include.type = x__EchoTest->Data[i].xmlmime__contentType;
response->x__EchoTest->Data[i].choice.xop__Include.options = NULL;
response->x__EchoTest->Data[i].xmlmime__contentType = x__EchoTest->Data[i].xmlmime__contentType;
break;
default:
return soap_sender_fault(soap, "Wrong data format", NULL);
}
}
return SOAP_OK;
}