diff hg-web/main.c @ 193:9f4429c49733 hg-web

[HgWeb] Making progress....
author MrJuneJune <me@mrjunejune.com>
date Sun, 25 Jan 2026 20:04:55 -0800
parents a2725419f988
children
line wrap: on
line diff
--- a/hg-web/main.c	Sat Jan 24 21:52:14 2026 -0800
+++ b/hg-web/main.c	Sun Jan 25 20:04:55 2026 -0800
@@ -127,6 +127,71 @@
   return resp;
 }
 
+Seobeo_Request_Entry* ApiGetGraph(Seobeo_Request_Entry *req, Dowa_Arena *arena)
+{
+  Seobeo_Request_Entry *resp = NULL;
+
+  void *path_kv = Dowa_HashMap_Get_Ptr(req, "QueryString");
+  const char *rel_path = path_kv ? ((Seobeo_Request_Entry*)path_kv)->value : "";
+  Seobeo_Log(SEOBEO_INFO, "ApiGetGraph: rel_path='%s'\n", rel_path);
+  void *graph_id_kv = Dowa_HashMap_Get_Ptr(req, ":graph_id");
+  char *graph_id = ((Seobeo_Request_Entry*)graph_id_kv)->value;
+  Seobeo_Log(SEOBEO_INFO, "ApiGetGraph: graph_id='%s'\n", graph_id);
+  char *decoded_path = Dowa_Arena_Allocate(arena, strlen(rel_path) + 1);
+  Seobeo_Url_Decode(decoded_path, rel_path);
+  char *safe_path = sanitize_path(decoded_path, arena);
+
+  Seobeo_Log(SEOBEO_INFO, "ApiGetGraph: safe_path='%s'\n", safe_path);
+
+  if (strlen(safe_path) == 0)
+  {
+    Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
+    Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
+    Dowa_HashMap_Push_Arena(resp, "body", "File path required", arena);
+    return resp;
+  }
+
+  char hg_path[MAX_PATH];
+  // void *graph_id_kv = Dowa_HashMap_Get_Ptr(req, ":graph_id");
+  // char *graph_id = ((Seobeo_Request_Entry*)graph_id_kv)->value;
+  snprintf(hg_path, sizeof(hg_path), "/graph/%s?%s", graph_id, safe_path);
+  Seobeo_Client_Response  *hg_response = hg_proxy_request("GET", hg_path, NULL, NULL);
+
+  Seobeo_Log(SEOBEO_DEBUG, "ApiGetGraph: status=%i body_len=%zu\n", hg_response->status_code, hg_response->body_length);
+
+  char status[4];
+  snprintf(status, 4, "%i", hg_response->status_code);
+
+  if (!hg_response->body)
+  {
+    Dowa_HashMap_Push_Arena(resp, "status", "502", arena);
+    Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
+    Dowa_HashMap_Push_Arena(resp, "body", "Failed to connect to hg serve", arena);
+    return resp;
+  }
+
+  if (hg_response->status_code != 200)
+  {
+    Seobeo_Log(SEOBEO_DEBUG, "ApiGetGraph: error hg_response: %s\n", hg_response->body);
+    Dowa_HashMap_Push_Arena(resp, "status", status, arena);
+    Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
+    Dowa_HashMap_Push_Arena(resp, "body", hg_response->body, arena);
+    return resp;
+  }
+
+
+  char *temp1 = Dowa_Arena_Copy(arena, hg_response->body, hg_response->body_length);
+  char *temp2 = Dowa_Arena_Allocate(arena, 256);
+  snprintf(temp2, 256, "%zu", hg_response->body_length);
+
+  Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
+  Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
+  Dowa_HashMap_Push_Arena(resp, "body", temp1, arena);
+  Dowa_HashMap_Push_Arena(resp, "content-length", temp2, arena);
+
+  return resp;
+}
+
 Seobeo_Request_Entry* ApiGetFile(Seobeo_Request_Entry *req, Dowa_Arena *arena)
 {
   Seobeo_Request_Entry *resp = NULL;
@@ -345,11 +410,30 @@
   return resp;
 }
 
+Seobeo_Request_Entry* GetReactHome(Seobeo_Request_Entry *req, Dowa_Arena *arena)
+{
+  size_t file_size = 0;
+  char *html = Seobeo_Web_LoadFile("/index.html", &file_size);
+
+  printf("%s", html);
+  Seobeo_Request_Entry *resp = NULL; 
+  Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
+  Dowa_HashMap_Push_Arena(resp, "content-type", "text/html", arena);
+  Dowa_HashMap_Push_Arena(resp, "body", html, arena);
+  return resp;
+}
+
 int main(void) {
   Seobeo_Router_Init();
 
+
+  Seobeo_Router_Register("GET", "/", GetReactHome);
+  Seobeo_Router_Register("GET", "/directories", GetReactHome);
+  Seobeo_Router_Register("GET", "/graph", GetReactHome);
+
   Seobeo_Router_Register("GET", "/api/repo/list", ApiListDirectory);
   Seobeo_Router_Register("GET", "/api/repo/file", ApiGetFile);
+  Seobeo_Router_Register("GET", "/api/graph/:graph_id", ApiGetGraph);
   Seobeo_Router_Register("GET", "/api/repo/readme", ApiGetReadme);
 
   // Use streaming handler for hg wire protocol...