From 37830a5317eed971b7316468a2ccf6b7968dbbd5 Mon Sep 17 00:00:00 2001 From: miker Date: Wed, 3 Aug 2005 03:11:17 +0000 Subject: [PATCH] quoting xml characters, bug fixes git-svn-id: svn://svn.open-ils.org/ILS/trunk@1591 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- OpenSRF/src/gateway/fieldmapper-c-xml-out.pl | 84 +++++++++++++------- OpenSRF/src/gateway/mod_ils_gateway.c | 3 +- 2 files changed, 56 insertions(+), 31 deletions(-) diff --git a/OpenSRF/src/gateway/fieldmapper-c-xml-out.pl b/OpenSRF/src/gateway/fieldmapper-c-xml-out.pl index da607273f8..dcf880f1c1 100755 --- a/OpenSRF/src/gateway/fieldmapper-c-xml-out.pl +++ b/OpenSRF/src/gateway/fieldmapper-c-xml-out.pl @@ -1,8 +1,13 @@ #!/usr/bin/perl -use strict; use warnings; -use lib '../../../Open-ILS/src/perlmods/'; +use strict; use lib '../perlmods/'; -use OpenILS::Utils::Fieldmapper; + +my $map = {}; +eval " + use lib '../../../Open-ILS/src/perlmods/'; + use OpenILS::Utils::Fieldmapper; +"; +$map = $Fieldmapper::fieldmap unless ($@); if(!$ARGV[1]) { @@ -19,11 +24,8 @@ print $ARGV[1] . "\n"; open(HEADER, ">$ARGV[0]"); open(SOURCE, ">$ARGV[1]"); - warn "Generating fieldmapper-c code...\n"; -my $map = $Fieldmapper::fieldmap; - print HEADER <"); for( i = 0; i!= obj->size; i++ ) { - _rest_xml_output(res_xml, obj->get_index(obj,i), NULL, 0); + _rest_xml_output(res_xml, obj->get_index(obj,i), NULL, 0,0); } buffer_add(res_xml, ""); @@ -73,10 +76,32 @@ char* json_string_to_xml(char* content) { return output; } -void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_index) { +char* _escape_xml (char* text) { + char* out; + growing_buffer* b = buffer_init(256); + int len = strlen(text); + int i; + for (i = 0; i < len; i++) { + if (text[i] == '&') + buffer_add(b,strdup("&")); + else if (text[i] == '<') + buffer_add(b,strdup("<")); + else if (text[i] == '>') + buffer_add(b,strdup(">")); + else + buffer_add_char(b,text[i]); + } + out = buffer_data(b); + buffer_free(b); + return out; +} + +void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_index, int notag) { char * tag; int i; + if (obj->classname) + notag = 1; if(fm_class) { tag = _lookup_fm_field(fm_class,fm_index); @@ -95,42 +120,42 @@ void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_ } /* now add the data */ - if(obj->is_null) - buffer_fadd(buf, "<%s/>",tag); - - else if(obj->is_bool && obj->bool_value) { - if (obj->classname) + if(obj->is_null) { + if (!notag) + buffer_fadd(buf, "<%s/>",tag); + } else if(obj->is_bool && obj->bool_value) { + if (notag) buffer_add(buf, "true"); else buffer_fadd(buf, "<%s>true",tag,tag); } else if(obj->is_bool && ! obj->bool_value) { - if (obj->classname) + if (notag) buffer_add(buf, "false"); else buffer_fadd(buf, "<%s>false",tag,tag); } else if (obj->is_string) { - if (obj->classname) - buffer_add(buf,obj->string_data); + if (notag) + buffer_add(buf,_escape_xml(obj->string_data)); else - buffer_fadd(buf,"<%s>%s",tag,obj->string_data,tag); + buffer_fadd(buf,"<%s>%s",tag,_escape_xml(obj->string_data),tag); } else if(obj->is_number) { - if (obj->classname) + if (notag) buffer_fadd(buf,"%ld",obj->num_value); else buffer_fadd(buf,"<%s>%ld",tag,obj->num_value,tag); } else if(obj->is_double) { - if (obj->classname) + if (notag) buffer_fadd(buf,"%lf",tag,obj->double_value,tag); else buffer_fadd(buf,"<%s>%lf",tag,obj->double_value,tag); } else if (obj->is_array) { - if(!obj->classname) { + if (!notag) { if(!fm_class) buffer_add(buf,""); else @@ -138,10 +163,10 @@ void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_ } for( i = 0; i!= obj->size; i++ ) { - _rest_xml_output(buf, obj->get_index(obj,i), obj->classname, i); + _rest_xml_output(buf, obj->get_index(obj,i), obj->classname, i,0); } - if(!obj->classname) { + if (!notag) { if(!fm_class) buffer_add(buf,""); else @@ -150,7 +175,7 @@ void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_ } else if (obj->is_hash) { - if(!obj->classname) { + if (!notag) { if(!fm_class) buffer_add(buf,""); else @@ -160,23 +185,24 @@ void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_ object_iterator* itr = new_iterator(obj); object_node* tmp; while( (tmp = itr->next(itr)) ) { - if (obj->classname) { + if (notag) { buffer_fadd(buf,"<%s>",tmp->key); } else { buffer_add(buf,""); buffer_fadd(buf,"%s",tmp->key); } - _rest_xml_output(buf, tmp->item, NULL,0); + _rest_xml_output(buf, tmp->item, NULL,0,notag); - if (obj->classname) { + if (notag) { buffer_fadd(buf,"",tmp->key); } else { buffer_add(buf,""); } } free_iterator(itr); - if(!obj->classname) { + + if (!notag) { if(!fm_class) buffer_add(buf,""); else @@ -185,7 +211,7 @@ void _rest_xml_output(growing_buffer* buf, object* obj, char * fm_class, int fm_ } - if(obj->classname) + if (obj->classname) buffer_fadd(buf,"",tag); } diff --git a/OpenSRF/src/gateway/mod_ils_gateway.c b/OpenSRF/src/gateway/mod_ils_gateway.c index 123509a20b..9751fb9115 100644 --- a/OpenSRF/src/gateway/mod_ils_gateway.c +++ b/OpenSRF/src/gateway/mod_ils_gateway.c @@ -368,15 +368,14 @@ static int mod_ils_gateway_method_handler (request_rec *r) { content = strdup(exception->to_json(exception)); free_object(exception); } else { + #ifdef RESTGATEWAY /* set content type to text/xml for passing around XML objects */ ap_set_content_type(r, "text/xml"); - content = json_string_to_xml( buffer_data(result_data) ); #else /* set content type to text/plain for passing around JSON objects */ ap_set_content_type(r, "text/plain"); - content = buffer_data(result_data); #endif } -- 2.43.2