Browse Source

Use the raw_path for proxying (as some media may include ? arguments).

default 4 months ago
parent
commit
a6bf1ee0d0
3 changed files with 10 additions and 1 deletions
  1. 7 1
      html.c
  2. 2 0
      xs_fcgi.h
  3. 1 0
      xs_httpd.h

+ 7 - 1
html.c

@@ -3216,7 +3216,13 @@ int html_get_handler(const xs_dict *req, const char *q_path,
             status = HTTP_STATUS_UNAUTHORIZED;
         }
         else {
-            xs *url = xs_replace(p_path, "proxy/", "https:/" "/");
+            /* pick the raw path (including optional ? arguments) */
+            const char *raw_path = xs_dict_get(req, "raw_path");
+
+            /* skip to where the proxy/ string starts */
+            raw_path += xs_str_in(raw_path, "proxy/");
+
+            xs *url = xs_replace(raw_path, "proxy/", "https:/" "/");
             xs *hdrs = xs_dict_new();
 
             hdrs = xs_dict_append(hdrs, "user-agent", USER_AGENT);

+ 2 - 0
xs_fcgi.h

@@ -179,6 +179,8 @@ xs_dict *xs_fcgi_request(FILE *f, xs_str **payload, int *p_size, int *fcgi_id)
                         req = xs_dict_append(req, "method", v);
                     else
                     if (strcmp(k, "REQUEST_URI") == 0) {
+                        req = xs_dict_append(req, "raw_path", v);
+
                         xs *pnv = xs_split_n(v, "?", 1);
 
                         /* store the path */

+ 1 - 0
xs_httpd.h

@@ -32,6 +32,7 @@ xs_dict *xs_httpd_request(FILE *f, xs_str **payload, int *p_size)
     xs_dict *req = xs_dict_new();
 
     req = xs_dict_append(req, "method", xs_list_get(l2, 0));
+    req = xs_dict_append(req, "raw_path", xs_list_get(l2, 1));
     req = xs_dict_append(req, "proto",  xs_list_get(l2, 2));
 
     {