Bug 15190: Bad utf8 decode to unapi and fixing status code 200
authorHector Castro <hector.hecaxmmx@gmail.com>
Tue, 12 Jan 2016 04:34:01 +0000 (22:34 -0600)
committerJulian Maurice <julian.maurice@biblibre.com>
Fri, 29 Jan 2016 15:05:11 +0000 (16:05 +0100)
Fix bad utf8 decoding, also fix status code 200 for no parameters passed to
script

To reproduce the issue in OPAC
1) Copy from LOC (Z39.50) ISBN 8467020113 or test it with whichever record with
   special characters
2) Open URL in OPAC cgi-bin/koha/unapi?id=koha:biblionumber:4&format=oai_dc
   play with oai_dc, srw_dc, mods, mods-full, mods3, mods3-full, rdfdc.
   Note: marcxml does not fail
3) Enter the new biblionumber for ISBN 8467020113 or the record of your choise
4) An oai_dc record will display, notice about the bad utf8
   decoding characters
5) Search the record in OPAC
6) To reproduce code 200 Ok and 300 Multiple choices play with:
    cgi-bin/koha/unapi
    cgi-bin/koha/unapi?id=koha:biblionumber:4
7) If possible test in NORMARC (UNIMARC will launch an error because bug 15162)

Test plan
-Apply patch
-Follow steps 2 to 6
-You will see no errors in utf8

Followed test plan, works as expected.
Signed-off-by: Marc Veron <veron@veron.ch>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Brendan A Gallagher <brendan@bywatersolutions.com>
(cherry picked from commit 283d80729a49c8821a5ce95bcf3affd24cce93e6)
Signed-off-by: Julian Maurice <julian.maurice@biblibre.com>

opac/unapi

index 7b21ee0..1b9281d 100755 (executable)
@@ -144,14 +144,14 @@ if (not defined $format) {
             my $parser = XML::LibXML->new();
             my $record_dom = $parser->parse_string( $marcxml );
             $record_dom = $transformer->transform( $record_dom );
-            $content = $record_dom->toString();
+            $content = $transformer->output_as_chars( $record_dom );
         };
         if ($@) {
             print $cgi->header( -status => '500 internal error ' . $@->code() . ": " . $@->message() );
             exit 0;
         }
 
-        print $cgi->header( -type =>'application/xml' );
+        print $cgi->header( -type =>'application/xml', -charset => 'UTF-8' );
         print $content;
     } else {
         # ID is obviously wrong, so 404
@@ -172,7 +172,7 @@ sub emit_formats {
     if (defined $id) {
         print $cgi->header( -type =>'application/xml', -status => '300 multiple choices' );
     } else {
-        print $cgi->header( -type =>'application/xml' );
+        print $cgi->header( -type =>'application/xml', -status => '200 Ok' );
     }
 
     print "<?xml version='1.0' encoding='utf-8'  ?>\n";