Changeset 32 in Main


Ignore:
Timestamp:
Sep 16, 2024, 9:42:19 PM (2 months ago)
Author:
Nishi
Message:

can handle cache headers.

Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Makefile

    r25 r32  
    2323
    2424format:
    25         clang-format --verbose -i `find ./Server ./Common ./Module -name "*.c" -or -name "*.h"`
     25        clang-format --verbose -i `find ./Server ./Common ./Module "(" -name "*.c" -or -name "*.h" ")" -and -not -name "strptime.*"`
    2626
    2727clean:
  • trunk/README

    r1 r32  
    11Simple HTTP daemon
     2
     3Put under public domain, except Server/strptime.{c,h}.
  • trunk/Server/Makefile

    r17 r32  
    66.SUFFIXES: .c .o
    77
    8 OBJS = version.o main.o config.o server.o ssl.o http.o module.o
     8OBJS = version.o main.o config.o server.o ssl.o http.o module.o strptime.o
    99
    1010all: tewi$(EXEC)
  • trunk/Server/server.c

    r31 r32  
    1616#include <stdarg.h>
    1717#include <sys/stat.h>
     18#include <time.h>
    1819
    1920#include <cm_string.h>
     
    2425#include <winsock2.h>
    2526#include <process.h>
     27
     28#include "strptime.h"
    2629#else
    2730#include <sys/select.h>
     
    170173            "</html>\n"
    171174
    172 void _tw_process_page(SSL* ssl, int sock, const char* status, const char* type, FILE* f, const unsigned char* doc, size_t size, char** headers) {
     175void _tw_process_page(SSL* ssl, int sock, const char* status, const char* type, FILE* f, const unsigned char* doc, size_t size, char** headers, time_t mtime, time_t cmtime) {
    173176        char construct[512];
     177        if(mtime != 0 && cmtime != 0 && mtime <= cmtime) {
     178                status = "304 Not Modified";
     179                type = NULL;
     180                size = 0;
     181                headers = NULL;
     182                f = NULL;
     183                doc = NULL;
     184        }
    174185        sprintf(construct, "%llu", (unsigned long long)size);
    175186        tw_write(ssl, sock, "HTTP/1.1 ", 9);
     
    188199                tw_write(ssl, sock, construct, strlen(construct));
    189200                tw_write(ssl, sock, "\r\n", 2);
     201                if(mtime != 0) {
     202                        struct tm* tm = gmtime(&mtime);
     203                        char date[513];
     204                        strftime(date, 512, "%a, %d %b %Y %H:%M:%S GMT", tm);
     205                        tw_write(ssl, sock, "Last-Modified: ", 5 + 8 + 2);
     206                        tw_write(ssl, sock, date, strlen(date));
     207                        tw_write(ssl, sock, "\r\n", 2);
     208                }
    190209        }
    191210        int i;
     
    215234}
    216235
    217 void tw_process_page(SSL* ssl, int sock, const char* status, const char* type, FILE* f, const unsigned char* doc, size_t size) { _tw_process_page(ssl, sock, status, type, f, doc, size, NULL); }
     236void tw_process_page(SSL* ssl, int sock, const char* status, const char* type, FILE* f, const unsigned char* doc, size_t size, time_t mtime, time_t cmtime) { _tw_process_page(ssl, sock, status, type, f, doc, size, NULL, mtime, cmtime); }
    218237
    219238const char* tw_http_status(int code) {
     
    258277void tw_http_error(SSL* ssl, int sock, int error, char* name, int port) {
    259278        char* str = tw_http_default_error(error, name, port);
    260         tw_process_page(ssl, sock, tw_http_status(error), "text/html", NULL, str, strlen(str));
     279        tw_process_page(ssl, sock, tw_http_status(error), "text/html", NULL, str, strlen(str), 0, 0);
    261280        free(str);
    262281}
     
    389408                char* vhost = cm_strdup(config.hostname);
    390409                int i;
     410                time_t cmtime = 0;
    391411                for(i = 0; req.headers[i] != NULL; i += 2) {
    392412                        if(cm_strcaseequ(req.headers[i], "Host")) {
    393413                                free(vhost);
    394                                 vhost = req.headers[i + 1];
    395                                 break;
     414                                vhost = cm_strdup(req.headers[i + 1]);
     415                        } else if(cm_strcaseequ(req.headers[i], "If-Modified-Since")) {
     416                                struct tm tm;
     417                                strptime(req.headers[i + 1], "%a, %d %b %Y %H:%M:%S GMT", &tm);
     418#ifdef __MINGW32__
     419                                cmtime = _mkgmtime(&tm);
     420#else
     421                                cmtime = timegm(&tm);
     422#endif
    396423                        }
    397424                }
     
    435462                                        if(req.path[strlen(req.path) - 1] != '/') {
    436463                                                char* headers[3] = {"Location", cm_strcat(req.path, "/"), NULL};
    437                                                 _tw_process_page(s, sock, tw_http_status(308), NULL, NULL, NULL, 0, headers);
     464                                                _tw_process_page(s, sock, tw_http_status(308), NULL, NULL, NULL, 0, headers, 0, 0);
    438465                                                free(headers[1]);
    439466                                        } else {
     
    458485                                                                stat(p, &st);
    459486                                                                char* mime = tw_get_mime(ext, vhost_entry);
    460                                                                 tw_process_page(s, sock, tw_http_status(200), mime, f, NULL, st.st_size);
     487                                                                tw_process_page(s, sock, tw_http_status(200), mime, f, NULL, st.st_size, 0, 0);
    461488                                                                fclose(f);
    462489                                                                free(p);
     
    572599                                                        addstring(&str, "       </body>\n");
    573600                                                        addstring(&str, "</html>\n");
    574                                                         tw_process_page(s, sock, tw_http_status(200), "text/html", NULL, str, strlen(str));
     601                                                        tw_process_page(s, sock, tw_http_status(200), "text/html", NULL, str, strlen(str), 0, 0);
    575602                                                        free(str);
    576603                                                }
     
    589616                                        if(ext != NULL) free(ext);
    590617                                        FILE* f = fopen(path, "rb");
    591                                         tw_process_page(s, sock, tw_http_status(200), mime, f, NULL, st.st_size);
     618                                        tw_process_page(s, sock, tw_http_status(200), mime, f, NULL, st.st_size, st.st_mtime, cmtime);
    592619                                        fclose(f);
    593620                                }
     
    599626                free(vhost);
    600627                free(host);
     628                tw_free_request(&req);
    601629        } else if(ret == -1) {
    602630        } else {
  • trunk/Server/tw_http.h

    r20 r32  
    2323#ifdef SOURCE
    2424#include <openssl/ssl.h>
     25void tw_free_request(struct tw_http_request* req);
    2526int tw_http_parse(SSL* ssl, int sock, struct tw_http_request* req);
    2627#endif
  • trunk/example.conf

    r30 r32  
    44#LoadModule /home/nishi/SVN/tewi/trunk/Module/mod_example.so
    55
    6 Listen 80
    7 ListenSSL 443
     6Listen 8080
     7#ListenSSL 443
    88
    99SSLKey key.pem
Note: See TracChangeset for help on using the changeset viewer.