tvote.c: use 307 redirect to avoid additional voting through refresh - vote - simple cgi voting system for web and gopher
 (HTM) git clone git://src.adamsgaard.dk/vote
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6cf52771bc127fbf083ca9badeeac6dba89d65fb
 (DIR) parent 0b3501599120c01cca8c2e8532fcd31e781f48ec
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       Date:   Mon, 28 Sep 2020 14:47:37 +0200
       
       vote.c: use 307 redirect to avoid additional voting through refresh
       
       Diffstat:
         M vote.c                              |      32 ++++++++++++++++++++++---------
       
       1 file changed, 23 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/vote.c b/vote.c
       t@@ -25,6 +25,10 @@ void
        http_status(int statuscode)
        {
                switch(statuscode) {
       +        case 307:
       +                printf("Status: 307 Temporary Redirect\r\n");
       +                printf("Location: /vote?poll=%s&choice=0\r\n\r\n", poll);
       +                break;
                case 401:
                        printf("Status: 401 Bad Request\r\n\r\n");
                        break;
       t@@ -402,28 +406,38 @@ main()
                        }
                }
        
       -        print_html_head();
       -
                parse_query();
        
                if (*create) {
       -                if (create_poll_file(poll, question, options) == 0)
       +                if (create_poll_file(poll, question, options) == 0) {
       +                        print_html_head();
                                show_poll(poll, 0);
       +                        print_html_foot();
       +                }
                } else if (*poll) {
                        if (*choice) {
       -                        c = strtonum(choice, 1, 256, &errstr);
       +                        c = strtonum(choice, 0, 256, &errstr);
                                if (errstr != NULL)
                                        errx(1, "could not parse choice: %s, %s", errstr, choice);
       -                        increment_option(poll, c);
       -                        show_poll(poll, 0);
       -                } else
       +                        if (c > 0) {
       +                                increment_option(poll, c);
       +                                http_status(307);
       +                        } else {
       +                                print_html_head();
       +                                show_poll(poll, 0);
       +                                print_html_foot();
       +                        }
       +                } else {
       +                        print_html_head();
                                show_poll(poll, 1);
       +                        print_html_foot();
       +                }
                } else {
       +                print_html_head();
                        list_polls();
                        print_poll_create_form();
       +                print_html_foot();
                }
        
       -        print_html_foot();
       -
                return 0;
        }