Changeset 24 in Main for trunk/Server/server.c


Ignore:
Timestamp:
Sep 14, 2024, 11:09:58 PM (2 months ago)
Author:
Nishi
Message:

redirects properly now

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Server/server.c

    r23 r24  
    170170            "</html>\n"
    171171
    172 void tw_process_page(SSL* ssl, int sock, const char* status, const char* type, FILE* f, const unsigned char* doc, size_t size) {
     172void _tw_process_page(SSL* ssl, int sock, const char* status, const char* type, FILE* f, const unsigned char* doc, size_t size, char** headers) {
    173173        char construct[512];
    174174        sprintf(construct, "%llu", (unsigned long long)size);
     
    176176        tw_write(ssl, sock, (char*)status, strlen(status));
    177177        tw_write(ssl, sock, "\r\n", 2);
    178         tw_write(ssl, sock, "Content-Type: ", 7 + 5 + 2);
    179         tw_write(ssl, sock, (char*)type, strlen(type));
    180         tw_write(ssl, sock, "\r\n", 2);
     178        if(type != NULL) {
     179                tw_write(ssl, sock, "Content-Type: ", 7 + 5 + 2);
     180                tw_write(ssl, sock, (char*)type, strlen(type));
     181                tw_write(ssl, sock, "\r\n", 2);
     182        }
    181183        tw_write(ssl, sock, "Server: ", 6 + 2);
    182184        tw_write(ssl, sock, tw_server, strlen(tw_server));
    183185        tw_write(ssl, sock, "\r\n", 2);
    184         tw_write(ssl, sock, "Content-Length: ", 7 + 7 + 2);
    185         tw_write(ssl, sock, construct, strlen(construct));
     186        if(size != 0) {
     187                tw_write(ssl, sock, "Content-Length: ", 7 + 7 + 2);
     188                tw_write(ssl, sock, construct, strlen(construct));
     189                tw_write(ssl, sock, "\r\n", 2);
     190        }
     191        int i;
     192        if(headers != NULL) {
     193                for(i = 0; headers[i] != NULL; i += 2) {
     194                        tw_write(ssl, sock, headers[i], strlen(headers[i]));
     195                        tw_write(ssl, sock, ": ", 2);
     196                        tw_write(ssl, sock, headers[i + 1], strlen(headers[i + 1]));
     197                        tw_write(ssl, sock, "\r\n", 2);
     198                }
     199        }
    186200        tw_write(ssl, sock, "\r\n", 2);
    187         tw_write(ssl, sock, "\r\n", 2);
     201        if(doc == NULL && f == NULL) return;
    188202        size_t incr = 0;
    189203        while(1) {
     
    201215}
    202216
     217void 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); }
     218
    203219const char* tw_http_status(int code) {
    204220        if(code == 200) {
    205221                return "200 OK";
     222        } else if(code == 308) {
     223                return "308 Permanent Redirect";
    206224        } else if(code == 400) {
    207225                return "400 Bad Request";
     
    415433                                        tw_http_error(s, sock, 403, name, port);
    416434                                } else if(S_ISDIR(st.st_mode)) {
    417                                         char* str = malloc(1);
    418                                         str[0] = 0;
    419                                         char** items = cm_scandir(path);
    420                                         addstring(&str, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n");
    421                                         addstring(&str, "<html>\n");
    422                                         addstring(&str, "       <head>\n");
    423                                         addstring(&str, "               <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
    424                                         addstring(&str, "               <title>Index of %h</title>\n", req.path);
    425                                         addstring(&str, "       </head>\n");
    426                                         addstring(&str, "       <body>\n");
    427                                         addstring(&str, "               <h1>Index of %h</h1>\n", req.path);
    428                                         addstring(&str, "               <hr>\n");
    429                                         addstring(&str, "               <table border=\"0\">\n");
    430                                         addstring(&str, "                       <tr>\n");
    431                                         addstring(&str, "                               <th></th>\n");
    432                                         addstring(&str, "                               <th>Filename</th>\n");
    433                                         addstring(&str, "                       </tr>\n");
    434                                         if(items != NULL) {
    435                                                 for(i = 0; items[i] != NULL; i++) {
    436                                                         char* ext = NULL;
    437                                                         int j;
    438                                                         for(j = strlen(items[i]) - 1; j >= 0; j--) {
    439                                                                 if(items[i][j] == '.') {
    440                                                                         ext = cm_strdup(items[i] + j);
    441                                                                         break;
     435                                        if(req.path[strlen(req.path) - 1] != '/') {
     436                                                char* headers[3] = {"Location", cm_strcat(req.path, "/"), NULL};
     437                                                _tw_process_page(s, sock, tw_http_status(308), NULL, NULL, NULL, 0, headers);
     438                                                free(headers[1]);
     439                                        } else {
     440                                                char** indexes = vhost_entry->index_count == 0 ? config.root.indexes : vhost_entry->indexes;
     441                                                int index_count = vhost_entry->index_count == 0 ? config.root.index_count : vhost_entry->index_count;
     442                                                bool found = false;
     443                                                for(i = 0; i < index_count; i++) {
     444                                                        char* p = cm_strcat3(path, "/", indexes[i]);
     445                                                        FILE* f = fopen(p, "rb");
     446                                                        if(f != NULL) {
     447                                                                char* ext = NULL;
     448                                                                int j;
     449                                                                for(j = strlen(p) - 1; j >= 0; j--) {
     450                                                                        if(p[j] == '.') {
     451                                                                                ext = cm_strdup(p + j);
     452                                                                                break;
     453                                                                        } else if(p[j] == '/') {
     454                                                                                break;
     455                                                                        }
     456                                                                }
     457                                                                struct stat st;
     458                                                                stat(p, &st);
     459                                                                char* mime = tw_get_mime(ext, vhost_entry);
     460                                                                tw_process_page(s, sock, tw_http_status(200), mime, f, NULL, st.st_size);
     461                                                                fclose(f);
     462                                                                free(p);
     463                                                                found = true;
     464                                                                break;
     465                                                        }
     466                                                        free(p);
     467                                                }
     468                                                if(!found) {
     469                                                        char* str = malloc(1);
     470                                                        str[0] = 0;
     471                                                        char** items = cm_scandir(path);
     472                                                        addstring(&str, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n");
     473                                                        addstring(&str, "<html>\n");
     474                                                        addstring(&str, "       <head>\n");
     475                                                        addstring(&str, "               <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n");
     476                                                        addstring(&str, "               <title>Index of %h</title>\n", req.path);
     477                                                        addstring(&str, "       </head>\n");
     478                                                        addstring(&str, "       <body>\n");
     479                                                        addstring(&str, "               <h1>Index of %h</h1>\n", req.path);
     480                                                        addstring(&str, "               <hr>\n");
     481                                                        addstring(&str, "               <table border=\"0\">\n");
     482                                                        addstring(&str, "                       <tr>\n");
     483                                                        addstring(&str, "                               <th></th>\n");
     484                                                        addstring(&str, "                               <th>Filename</th>\n");
     485                                                        addstring(&str, "                       </tr>\n");
     486                                                        if(items != NULL) {
     487                                                                for(i = 0; items[i] != NULL; i++) {
     488                                                                        char* ext = NULL;
     489                                                                        int j;
     490                                                                        for(j = strlen(items[i]) - 1; j >= 0; j--) {
     491                                                                                if(items[i][j] == '.') {
     492                                                                                        ext = cm_strdup(items[i] + j);
     493                                                                                        break;
     494                                                                                } else if(items[i][j] == '/') {
     495                                                                                        break;
     496                                                                                }
     497                                                                        }
     498                                                                        char* mime = tw_get_mime(ext, vhost_entry);
     499                                                                        if(strcmp(items[i], "../") == 0) {
     500                                                                                mime = "misc/parent";
     501                                                                        } else if(items[i][strlen(items[i]) - 1] == '/') {
     502                                                                                mime = "misc/dir";
     503                                                                        }
     504                                                                        char* icon = tw_get_icon(mime, vhost_entry);
     505                                                                        if(ext != NULL) free(ext);
     506                                                                        char* itm = cm_strdup(items[i]);
     507                                                                        if(strlen(itm) >= 32) {
     508                                                                                if(itm[strlen(itm) - 1] == '/') {
     509                                                                                        itm[31] = 0;
     510                                                                                        itm[30] = '/';
     511                                                                                        itm[29] = '.';
     512                                                                                        itm[28] = '.';
     513                                                                                        itm[27] = '.';
     514                                                                                } else {
     515                                                                                        itm[31] = 0;
     516                                                                                        itm[30] = '.';
     517                                                                                        itm[29] = '.';
     518                                                                                        itm[28] = '.';
     519                                                                                }
     520                                                                        }
     521                                                                        addstring(&str, "<tr>\n");
     522                                                                        addstring(&str, "       <td><img src=\"%s\" alt=\"icon\"></td>\n", icon);
     523                                                                        addstring(&str, "       <td><a href=\"%l\"><code>%h</code></a></td>\n", items[i], itm);
     524                                                                        addstring(&str, "</tr>\n");
     525                                                                        free(itm);
    442526                                                                }
    443527                                                        }
    444                                                         char* mime = tw_get_mime(ext, vhost_entry);
    445                                                         if(strcmp(items[i], "../") == 0) {
    446                                                                 mime = "misc/parent";
    447                                                         } else if(items[i][strlen(items[i]) - 1] == '/') {
    448                                                                 mime = "misc/dir";
    449                                                         }
    450                                                         char* icon = tw_get_icon(mime, vhost_entry);
    451                                                         if(ext != NULL) free(ext);
    452                                                         char* itm = cm_strdup(items[i]);
    453                                                         if(strlen(itm) >= 32) {
    454                                                                 if(itm[strlen(itm) - 1] == '/') {
    455                                                                         itm[31] = 0;
    456                                                                         itm[30] = '/';
    457                                                                         itm[29] = '.';
    458                                                                         itm[28] = '.';
    459                                                                         itm[27] = '.';
    460                                                                 } else {
    461                                                                         itm[31] = 0;
    462                                                                         itm[30] = '.';
    463                                                                         itm[29] = '.';
    464                                                                         itm[28] = '.';
    465                                                                 }
    466                                                         }
    467                                                         addstring(&str, "<tr>\n");
    468                                                         addstring(&str, "       <td><img src=\"%s\" alt=\"icon\"></td>\n", icon);
    469                                                         addstring(&str, "       <td><a href=\"%l\"><code>%h</code></a></td>\n", items[i], itm);
    470                                                         addstring(&str, "</tr>\n");
    471                                                         free(itm);
     528                                                        addstring(&str, "               </table>\n");
     529                                                        addstring(&str, "               <hr>\n");
     530                                                        addstring(&str, "               <address>%s Server at %s Port %d</address>\n", tw_server, name, port);
     531                                                        addstring(&str, "       </body>\n");
     532                                                        addstring(&str, "</html>\n");
     533                                                        tw_process_page(s, sock, tw_http_status(200), "text/html", NULL, str, strlen(str));
     534                                                        free(str);
    472535                                                }
    473536                                        }
    474                                         addstring(&str, "               </table>\n");
    475                                         addstring(&str, "               <hr>\n");
    476                                         addstring(&str, "               <address>%s Server at %s Port %d</address>\n", tw_server, name, port);
    477                                         addstring(&str, "       </body>\n");
    478                                         addstring(&str, "</html>\n");
    479                                         tw_process_page(s, sock, tw_http_status(200), "text/html", NULL, str, strlen(str));
    480                                         free(str);
    481537                                } else {
    482538                                        char* ext = NULL;
     
    484540                                                if(req.path[i] == '.') {
    485541                                                        ext = cm_strdup(req.path + i);
     542                                                        break;
     543                                                } else if(req.path[i] == '/') {
    486544                                                        break;
    487545                                                }
Note: See TracChangeset for help on using the changeset viewer.