Ignoring blank spaces in SOAP

Fernando Herrera <[email protected]> Thu, 1 Jul 2004 21:36:28 +0200
Newsgroups gmane.comp.gnome.ximian.soup
Message-ID <[email protected]>
--fUYQa+Pmc3FrFX/N
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit


	Hi, I was writing test cases for the libsoup XML-RPC stuff and
also did some for SOAP. I realized that for example google SOAP API was
failing because the xml parsing is interpreting blank characters and new
lines as nodes. The most simple solution would be the following patch:

--- libsoup/soup-soap-response.c        18 Feb 2004 15:00:34 -0000 1.12
+++ libsoup/soup-soap-response.c        1 Jul 2004 19:04:04 -0000
@@ -153,6 +153,7 @@
                old_doc = response->priv->xmldoc;

        /* parse the string */
+       xmlKeepBlanksDefault (0);
        response->priv->xmldoc = xmlParseMemory (xmlstr, strlen (xmlstr));
        if (!response->priv->xmldoc) {
                response->priv->xmldoc = old_doc;

	The other option is using xmlIsBlankNode almost everywhere.

	I've attached the google api test.

Salu2

-- 
Fernando Herrera de las Heras
Onírica: análisis, diseño e implantación de soluciones informáticas
http://www.onirica.com

--fUYQa+Pmc3FrFX/N
Content-Type: text/x-csrc; charset=us-ascii
Content-Disposition: attachment; filename="soap-google.c"

#include <config.h>

#include <stdio.h>
#include <stdlib.h>

#include "libsoup/soup-session-sync.h"
#include "libsoup/soup-soap-message.h"
#include "libsoup/soup-soap-response.h"

void
parse_response (SoupSoapMessage *req)
{
	SoupSoapResponse *response;
	SoupSoapParameter *result, *item, *tmp;
	char *title, *url;

	g_print ("Results:\n");
	response = soup_soap_message_parse_response (req);
	result = soup_soap_response_get_first_parameter_by_name (response, "return");
	if (result == NULL) {
		g_object_unref (response);
		return;
	}
	result = soup_soap_parameter_get_first_child_by_name (result, "resultElements");
	if (result == NULL) {
		g_object_unref (response);
		return;
	}

	item = soup_soap_parameter_get_first_child_by_name (result, "item");
	while (item != NULL) {
		tmp = soup_soap_parameter_get_first_child_by_name (item, "title");
		title = soup_soap_parameter_get_string_value (tmp);
		tmp = soup_soap_parameter_get_first_child_by_name (item, "URL");
		url = soup_soap_parameter_get_string_value (tmp);
		g_print ("%s (%s)\n", url, title);
		g_free (title);
		g_free (url);
		item = soup_soap_parameter_get_next_child_by_name (item, "item");
	}
	
	g_object_unref (response);
	return;
}



int
main (int argc, char **argv)
{
	SoupSoapMessage *message;
	SoupSession *session;

	xmlDocPtr xml;
	char *string;
	int size;
	
	if (argc != 2) {
		g_print ("Usage %s: <google SOAP API key>\n", argv[0]);
		return 1;
	}

	g_type_init ();
	g_thread_init (NULL);

	message = soup_soap_message_new ("POST", "http://api.google.com/search/beta2",
					 TRUE, "UTF-8", NULL, NULL);

	soup_soap_message_start_envelope (message);
	soup_soap_message_start_body (message);

	soup_soap_message_start_element (message, "doGoogleSearch", "ns1", "urn:GoogleSearch");

	soup_soap_message_start_element (message, "key", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:string");
	soup_soap_message_write_string (message, argv[1]);
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "q", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:string");
	soup_soap_message_write_string (message, "gnome");
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "start", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:int");
	soup_soap_message_write_int (message, 0);
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "maxResults", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:int");
	soup_soap_message_write_int (message, 10);
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "filter", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:boolean");
	soup_soap_message_write_string (message, "false");
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "restrict", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:string");
	soup_soap_message_write_string (message, "");
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "safeSearch", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:boolean");
	soup_soap_message_write_string (message, "false");
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "lr", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:string");
	soup_soap_message_write_string (message, "");
	soup_soap_message_end_element (message);


	soup_soap_message_start_element (message, "ie", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:string");
	soup_soap_message_write_string (message, "latin1");
	soup_soap_message_end_element (message);

	soup_soap_message_start_element (message, "oe", NULL, NULL);
	soup_soap_message_set_element_type (message, "xsd:string");
	soup_soap_message_write_string (message, "latin1");
	soup_soap_message_end_element (message);

	soup_soap_message_end_element (message);

	soup_soap_message_end_body (message);
	soup_soap_message_end_envelope (message);

	soup_soap_message_persist (message);
	session = soup_session_sync_new ();
	xml = soup_soap_message_get_xml_doc (message);
	xmlDocDumpMemory ((xmlDocPtr) xml, (xmlChar **) &string, &size);
	g_print ("Sending:\n%s\n", string);

	soup_session_send_message (session, SOUP_MESSAGE (message));

	parse_response (message);

	g_object_unref (message);
	g_object_unref (session);

	return 0;
}

--fUYQa+Pmc3FrFX/N--
_______________________________________________
Soup-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/soup-list