about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rwxr-xr-xpublic-inbox-cgi13
1 files changed, 11 insertions, 2 deletions
diff --git a/public-inbox-cgi b/public-inbox-cgi
index 91314f06..cd79a4a7 100755
--- a/public-inbox-cgi
+++ b/public-inbox-cgi
@@ -26,11 +26,10 @@ BEGIN {
         }
 }
 
-binmode STDOUT, ':utf8';
-
 my $ret = main();
 
 my ($status, $headers, $body) = @$ret;
+set_binmode($headers);
 if (@ARGV && $ARGV[0] eq 'static') {
         print $body;
 } else { # CGI
@@ -143,3 +142,13 @@ sub get_mid_txt {
         my $x = mid2blob($ctx);
         $x ? [ "200 OK", {'Content-Type' => 'text/plain'}, $$x ] : r404();
 }
+
+sub set_binmode {
+        my ($headers) = @_;
+        if ($headers->{'Content-Type'} eq 'text/plain') {
+                # no way to validate raw messages, mixed encoding is possible.
+                binmode STDOUT;
+        } else { # strict encoding for HTML and XML
+                binmode STDOUT, ':encoding(UTF-8)';
+        }
+}