]> prime8.dev >> repos - ttyd.git/commitdiff
Improvements for --base-path usage (#292)
authorDaniel Monteiro Basso <daniel@basso.inf.br>
Wed, 25 Mar 2020 09:12:33 +0000 (09:12 +0000)
committerGitHub <noreply@github.com>
Wed, 25 Mar 2020 09:12:33 +0000 (17:12 +0800)
* Trim trailing slashes in --base-path option

* Redirect `/base-path` to `/base-path/`

* Log endpoints if --base-path is provided

* Use predefined token for standard header 'location'

src/http.c
src/server.c
src/server.h

index 70b7368add39d68326d27a31324edab1d518a556..06734ee2fed274ef458287890d3590ffe7f558b4 100644 (file)
@@ -160,6 +160,21 @@ int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user,
         break;
       }
 
+      // accessing `/base-path` redirects to `/base-path/`
+      if (strcmp(pss->path, endpoints.parent) == 0) {
+        if (lws_add_http_header_status(wsi, HTTP_STATUS_FOUND, &p, end)
+            || lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_LOCATION,
+                                            endpoints.index,
+                                            strlen(endpoints.index), &p, end)
+            || lws_add_http_header_content_length(wsi, 0, &p, end)
+            || lws_finalize_http_header(wsi, &p, end)
+            || lws_write(wsi, buffer + LWS_PRE, p - (buffer + LWS_PRE),
+                         LWS_WRITE_HTTP_HEADERS) < 0
+        )
+          return 1;
+        goto try_to_reuse;
+      }
+
       if (strcmp(pss->path, endpoints.index) != 0) {
         lws_return_http_status(wsi, HTTP_STATUS_NOT_FOUND, NULL);
         goto try_to_reuse;
index 3debb14ba32d206e875bbce54089c561abca31e9..b243b317b5a7da633d03ef9f82d2a6ed9d89663b 100644 (file)
@@ -20,7 +20,7 @@
 volatile bool force_exit = false;
 struct lws_context *context;
 struct server *server;
-struct endpoints endpoints = {"/ws", "/", "/token"};
+struct endpoints endpoints = {"/ws", "/", "/token", ""};
 
 extern int callback_http(struct lws *wsi, enum lws_callback_reasons reason,
                          void *user, void *in, size_t len);
@@ -370,10 +370,12 @@ int main(int argc, char **argv) {
         char path[128];
         strncpy(path, optarg, 128);
         size_t len = strlen(path);
+        while (len && path[len - 1] == '/') path[--len] = 0; // trim trailing /
+        if (!len) break;
 #define sc(f)                                  \
   strncpy(path + len, endpoints.f, 128 - len); \
   endpoints.f = strdup(path);
-        sc(ws) sc(index) sc(token)
+        sc(ws) sc(index) sc(token) sc(parent)
 #undef sc
       } break;
       case '6':
@@ -484,6 +486,13 @@ int main(int argc, char **argv) {
   lwsl_notice("  start command: %s\n", server->command);
   lwsl_notice("  close signal: %s (%d)\n", server->sig_name, server->sig_code);
   lwsl_notice("  terminal type: %s\n", server->terminal_type);
+  if (endpoints.parent[0]) {
+    lwsl_notice("endpoints:\n");
+    lwsl_notice("  base-path: %s\n", endpoints.parent);
+    lwsl_notice("  index    : %s\n", endpoints.index);
+    lwsl_notice("  token    : %s\n", endpoints.token);
+    lwsl_notice("  websocket: %s\n", endpoints.ws);
+  }
   if (server->check_origin) lwsl_notice("  check origin: true\n");
   if (server->url_arg) lwsl_notice("  allow url arg: true\n");
   if (server->readonly) lwsl_notice("  readonly: true\n");
index cd6f49d73b35a8b76b4fc2066c0face803cde238..03318ff380bda0ac48e7e72a2416407f78d67ff4 100644 (file)
@@ -18,6 +18,7 @@ struct endpoints {
   char *ws;
   char *index;
   char *token;
+  char *parent;
 };
 
 extern volatile bool force_exit;