chiark / gitweb /
Better error messages from commod-update-receiver
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 2 Nov 2009 18:15:02 +0000 (18:15 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 2 Nov 2009 18:15:02 +0000 (18:15 +0000)
yarrg/Commods.pm
yarrg/TODO
yarrg/commod-update-receiver

index c6ed253..b7b18a6 100644 (file)
@@ -40,7 +40,7 @@ BEGIN {
                      %oceans %commods %clients %commodclasses
                      %vessels %shotname2damage
                      &parse_pctb_commodmap %pctb_commodmap @pctb_commodmap
-                     &get_our_version &check_tsv_line
+                     &get_our_version &check_tsv_line &errsan
                      &pipethrough_prep &pipethrough_run
                      &pipethrough_run_along &pipethrough_run_finish
                      &pipethrough_run_gzip &http_useragent &version_core
@@ -406,6 +406,12 @@ sub cgipostform ($$$) {
 
 our %check_tsv_done;
 
+sub errsan ($) {
+    my ($value) = @_;
+    $value =~ s/[^-+\'. A-Za-z0-9]/ sprintf "\\x%02x",ord $& /ge;
+    return "\"$value\"";
+}
+
 sub check_tsv_line ($$) {
     my ($l, $bad_data_callback) = @_;
     my $bad_data= sub { &$bad_data_callback("bad data: line $.: $_[0]"); };
@@ -419,15 +425,19 @@ sub check_tsv_line ($$) {
 
     !keys %commods or
        defined $commods{$commod} or
-       &$bad_data("unknown commodity \`$commod'");
+       &$bad_data("unknown commodity ".errsan($commod));
     
-    $stall =~ m/^\p{IsUpper}|^[0-9]/ or &$bad_data("stall not capitalised");
-    !exists $check_tsv_done{$commod,$stall} or &$bad_data("repeated data");
+    $stall =~ m/^\p{IsUpper}|^[0-9]/ or
+       &$bad_data("stall not capitalised ".errsan($stall));
+    !exists $check_tsv_done{$commod,$stall} or
+       &$bad_data("repeated data ".errsan($commod).",".errsan($stall));
     $check_tsv_done{$commod,$stall}= 1;
     foreach my $i (2..5) {
        my $f= $v[$i];
-       $f =~ m/^(|0|[1-9][0-9]{0,5}|\>1000)$/ or &$bad_data("bad field $i");
-       ($i % 2) or ($f !~ m/\>/) or &$bad_data("> in field $i price");
+       $f =~ m/^(|0|[1-9][0-9]{0,5}|\>1000)$/ or
+           &$bad_data("bad field $i ".errsan($f));
+       ($i % 2) or ($f !~ m/\>/) or
+           &$bad_data("> in field $i price ".errsan($f));
     }
 
     foreach my $i (2,4) {
index b6d8059..e8edb94 100644 (file)
@@ -8,9 +8,6 @@ windows uploader
 DATABASE/DICTIONARY MANAGER
 ---------------------------
 
-when update rejected print better error message including
- broken commodity name
-
 support Opal and Jade (currently there are some unicode problems)
 
 WEBSITE
index e03a918..123ca0c 100755 (executable)
@@ -93,7 +93,7 @@ addlog("receiving");
 
 $o{'clientname'}= must_param('clientname',$re_any);
 my $clientinfo= $clients{$o{'clientname'}};
-fail('unknown client') unless defined $clientinfo;
+fail('unknown client '.errsan($o{'clientname'})) unless defined $clientinfo;
 
 my $clientfixes= must_param('clientfixes', "^([-0-9a-z ]*)\$");
 my @clientfixes= sort grep { m/./ } split /\s+/, $clientfixes;
@@ -115,7 +115,7 @@ $o{'ocean'}= must_param('ocean', $re_any);
 $o{'island'}= must_param('island', $re_any);
 
 my $arches= $oceans{$o{'ocean'}};
-fail("unknown ocean") unless $arches;
+fail("unknown ocean ".errsan($o{'ocean'})) unless $arches;
 
 parse_info_serverside_ocean($o{'ocean'});
 
@@ -126,7 +126,7 @@ foreach my $islands (values %$arches) {
     die if $island_found;
     $island_found= $sources;
 }
-fail("unknown island") unless $island_found;
+fail("unknown island ".errsan($o{'island'})) unless $island_found;
 
 $o{'timestamp'}= must_param('timestamp', "^([1-9]\\d{1,20})\$");
 fail("clock skew") if $o{'timestamp'} >= $now;