annotate hg-web/main.c @ 195:f8f5004a920a

Merging back hg-web-tip
author MrJuneJune <me@mrjunejune.com>
date Tue, 27 Jan 2026 06:51:44 -0800
parents 9f4429c49733
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
1 #include "seobeo/seobeo.h"
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
2 #include "dowa/dowa.h"
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
3 #include <stdio.h>
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
4 #include <stdlib.h>
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
5 #include <string.h>
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
6 #include <ctype.h>
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
7 #include <unistd.h>
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
8 #include <sys/socket.h>
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
9 #include <netinet/in.h>
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
10 #include <arpa/inet.h>
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
11 #include <netdb.h>
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
12
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
13 #define HG_SERVE_HOST "127.0.0.1"
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
14 #define HG_SERVE_PORT "4444"
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
15
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
16 #define MAX_PATH 4096
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
17
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
18 static char* sanitize_path(const char *input_path, Dowa_Arena *arena)
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
19 {
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
20 if (!input_path || strlen(input_path) == 0)
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
21 {
188
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
22 char *empty = Dowa_Arena_Allocate(arena, 1);
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
23 empty[0] = '\0';
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
24 return empty;
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
25 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
26
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
27 size_t len = strlen(input_path);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
28 char *result = Dowa_Arena_Allocate(arena, len + 1);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
29 size_t j = 0;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
30
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
31 for (size_t i = 0; i < len; i++)
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
32 {
188
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
33 if (input_path[i] == '.' && (i == 0 || input_path[i-1] == '/'))
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
34 {
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
35 if (i + 1 < len && input_path[i+1] == '.')
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
36 {
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
37 // Skip ".."
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
38 i++;
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
39 continue;
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
40 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
41 // Skip "."
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
42 continue;
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
43 }
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
44 result[j++] = input_path[i];
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
45 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
46 result[j] = '\0';
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
47
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
48 // Remove leading/trailing slashes
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
49 while (result[0] == '/')
188
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
50 memmove(result, result + 1, strlen(result));
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
51 while (j > 0 && result[j-1] == '/')
188
32ce881452fa Fixing few stuff.
MrJuneJune <me@mrjunejune.com>
parents: 175
diff changeset
52 result[--j] = '\0';
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
53
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
54 return result;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
55 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
56
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
57 Seobeo_Client_Response *hg_proxy_request(
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
58 const char *method,
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
59 const char *path,
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
60 const char *req_body,
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
61 const char *hg_custom)
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
62 {
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
63 char full_path[MAX_PATH];
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
64 snprintf(full_path, MAX_PATH, "http://%s:%s%s", HG_SERVE_HOST, HG_SERVE_PORT, path);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
65 Seobeo_Log(SEOBEO_DEBUG, "HG Proxy PATH %s\n", full_path);
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
66 Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create(full_path);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
67 Seobeo_Client_Request_Set_Method(p_req, method);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
68 Seobeo_Client_Request_Add_Header_Array(p_req, "User-Agent: Seobeo/1.0");
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
69 Seobeo_Client_Request_Add_Header_Array(p_req, "Accept: application/json");
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
70
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
71 if (hg_custom && hg_custom[0] != '\0')
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
72 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
73 char buffer[1024];
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
74 snprintf(buffer, 1024, "x-hgarg-1: %s", hg_custom);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
75 Seobeo_Client_Request_Add_Header_Array(p_req, buffer);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
76 Seobeo_Log(SEOBEO_DEBUG, "HG CUSTOM %s\n", buffer);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
77 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
78
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
79 if (req_body)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
80 Seobeo_Client_Request_Set_Body(p_req, req_body, strlen(req_body));
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
81 Seobeo_Client_Response *p_resp = Seobeo_Client_Request_Execute(p_req);
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
82 Seobeo_Client_Request_Destroy(p_req);
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
83 return p_resp;
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
84 }
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
85
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
86 Seobeo_Request_Entry* ApiListDirectory(Seobeo_Request_Entry *req, Dowa_Arena *arena)
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
87 {
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
88 Seobeo_Request_Entry *resp = NULL;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
89
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
90 void *path_kv = Dowa_HashMap_Get_Ptr(req, "query_path");
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
91 const char *rel_path = path_kv ? ((Seobeo_Request_Entry*)path_kv)->value : "";
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
92
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
93 char *decoded_path = Dowa_Arena_Allocate(arena, strlen(rel_path) + 1);
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
94 Seobeo_Url_Decode(decoded_path, rel_path);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
95
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
96 char *safe_path = sanitize_path(decoded_path, arena);
106
daf2d393741a Debugging in server.
June Park <parkjune1995@gmail.com>
parents: 104
diff changeset
97
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
98 Seobeo_Log(SEOBEO_INFO, "ApiListDirectory: safe_path='%s'\n", safe_path);
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
99
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
100 char hg_path[MAX_PATH];
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
101 if (strlen(safe_path) > 0)
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
102 snprintf(hg_path, sizeof(hg_path), "/file/tip/%s?style=json", safe_path);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
103 else
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
104 snprintf(hg_path, sizeof(hg_path), "/file/tip/?style=json");
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
105
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
106 Seobeo_Client_Response *hg_response = hg_proxy_request("GET", hg_path, NULL, NULL);
106
daf2d393741a Debugging in server.
June Park <parkjune1995@gmail.com>
parents: 104
diff changeset
107
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
108 Seobeo_Log(SEOBEO_DEBUG, "ApiListDirectory: status=%i body_len=%zu\n", hg_response->status_code, hg_response->body_length);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
109
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
110 if (hg_response->status_code != 200)
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
111 {
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
112 Seobeo_Log(SEOBEO_DEBUG, "Failed to get directory from hg serve\n");
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
113 Dowa_HashMap_Push_Arena(resp, "status", "502", arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
114 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
115 Dowa_HashMap_Push_Arena(resp, "body", "{\"error\":\"Failed to connect to hg serve\"}", arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
116 return resp;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
117 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
118
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
119 char *temp1 = Dowa_Arena_Copy(arena, hg_response->body, hg_response->body_length);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
120 char *temp2 = Dowa_Arena_Allocate(arena, 256);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
121 snprintf(temp2, 256, "%zu", hg_response->body_length);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
122
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
123 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
124 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
125 Dowa_HashMap_Push_Arena(resp, "body", temp1, arena);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
126 Dowa_HashMap_Push_Arena(resp, "content-length", temp2, arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
127 return resp;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
128 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
129
193
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
130 Seobeo_Request_Entry* ApiGetGraph(Seobeo_Request_Entry *req, Dowa_Arena *arena)
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
131 {
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
132 Seobeo_Request_Entry *resp = NULL;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
133
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
134 void *path_kv = Dowa_HashMap_Get_Ptr(req, "QueryString");
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
135 const char *rel_path = path_kv ? ((Seobeo_Request_Entry*)path_kv)->value : "";
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
136 Seobeo_Log(SEOBEO_INFO, "ApiGetGraph: rel_path='%s'\n", rel_path);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
137 void *graph_id_kv = Dowa_HashMap_Get_Ptr(req, ":graph_id");
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
138 char *graph_id = ((Seobeo_Request_Entry*)graph_id_kv)->value;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
139 Seobeo_Log(SEOBEO_INFO, "ApiGetGraph: graph_id='%s'\n", graph_id);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
140 char *decoded_path = Dowa_Arena_Allocate(arena, strlen(rel_path) + 1);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
141 Seobeo_Url_Decode(decoded_path, rel_path);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
142 char *safe_path = sanitize_path(decoded_path, arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
143
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
144 Seobeo_Log(SEOBEO_INFO, "ApiGetGraph: safe_path='%s'\n", safe_path);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
145
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
146 if (strlen(safe_path) == 0)
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
147 {
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
148 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
149 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
150 Dowa_HashMap_Push_Arena(resp, "body", "File path required", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
151 return resp;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
152 }
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
153
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
154 char hg_path[MAX_PATH];
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
155 // void *graph_id_kv = Dowa_HashMap_Get_Ptr(req, ":graph_id");
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
156 // char *graph_id = ((Seobeo_Request_Entry*)graph_id_kv)->value;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
157 snprintf(hg_path, sizeof(hg_path), "/graph/%s?%s", graph_id, safe_path);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
158 Seobeo_Client_Response *hg_response = hg_proxy_request("GET", hg_path, NULL, NULL);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
159
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
160 Seobeo_Log(SEOBEO_DEBUG, "ApiGetGraph: status=%i body_len=%zu\n", hg_response->status_code, hg_response->body_length);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
161
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
162 char status[4];
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
163 snprintf(status, 4, "%i", hg_response->status_code);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
164
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
165 if (!hg_response->body)
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
166 {
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
167 Dowa_HashMap_Push_Arena(resp, "status", "502", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
168 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
169 Dowa_HashMap_Push_Arena(resp, "body", "Failed to connect to hg serve", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
170 return resp;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
171 }
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
172
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
173 if (hg_response->status_code != 200)
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
174 {
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
175 Seobeo_Log(SEOBEO_DEBUG, "ApiGetGraph: error hg_response: %s\n", hg_response->body);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
176 Dowa_HashMap_Push_Arena(resp, "status", status, arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
177 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
178 Dowa_HashMap_Push_Arena(resp, "body", hg_response->body, arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
179 return resp;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
180 }
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
181
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
182
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
183 char *temp1 = Dowa_Arena_Copy(arena, hg_response->body, hg_response->body_length);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
184 char *temp2 = Dowa_Arena_Allocate(arena, 256);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
185 snprintf(temp2, 256, "%zu", hg_response->body_length);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
186
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
187 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
188 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
189 Dowa_HashMap_Push_Arena(resp, "body", temp1, arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
190 Dowa_HashMap_Push_Arena(resp, "content-length", temp2, arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
191
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
192 return resp;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
193 }
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
194
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
195 Seobeo_Request_Entry* ApiGetFile(Seobeo_Request_Entry *req, Dowa_Arena *arena)
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
196 {
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
197 Seobeo_Request_Entry *resp = NULL;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
198
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
199 void *path_kv = Dowa_HashMap_Get_Ptr(req, "query_path");
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
200 const char *rel_path = path_kv ? ((Seobeo_Request_Entry*)path_kv)->value : "";
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
201 char *decoded_path = Dowa_Arena_Allocate(arena, strlen(rel_path) + 1);
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
202 Seobeo_Url_Decode(decoded_path, rel_path);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
203 char *safe_path = sanitize_path(decoded_path, arena);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
204
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
205 Seobeo_Log(SEOBEO_INFO, "ApiGetFile: safe_path='%s'\n", safe_path);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
206
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
207 if (strlen(safe_path) == 0)
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
208 {
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
209 Dowa_HashMap_Push_Arena(resp, "status", "400", arena);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
210 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
211 Dowa_HashMap_Push_Arena(resp, "body", "File path required", arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
212 return resp;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
213 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
214
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
215 char hg_path[MAX_PATH];
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
216 snprintf(hg_path, sizeof(hg_path), "/raw-file/tip/%s", safe_path);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
217 Seobeo_Client_Response *hg_response = hg_proxy_request("GET", hg_path, NULL, NULL);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
218
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
219 Seobeo_Log(SEOBEO_DEBUG, "ApiGetFile: status=%i body_len=%zu\n", hg_response->status_code, hg_response->body_length);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
220
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
221 char status[4];
190
a2725419f988 Updated so that bun builds will with already existing js files.
MrJuneJune <me@mrjunejune.com>
parents: 188
diff changeset
222 snprintf(status, 4, "%i", hg_response->status_code);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
223
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
224 if (!hg_response->body)
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
225 {
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
226 Dowa_HashMap_Push_Arena(resp, "status", "502", arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
227 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
228 Dowa_HashMap_Push_Arena(resp, "body", "Failed to connect to hg serve", arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
229 return resp;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
230 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
231
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
232 if (hg_response->status_code != 200)
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
233 {
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
234 Seobeo_Log(SEOBEO_DEBUG, "ApiGetFile: error hg_response: %s\n", hg_response->body);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
235 Dowa_HashMap_Push_Arena(resp, "status", status, arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
236 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
237 Dowa_HashMap_Push_Arena(resp, "body", hg_response->body, arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
238 return resp;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
239 }
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
240
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
241
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
242 char *temp1 = Dowa_Arena_Copy(arena, hg_response->body, hg_response->body_length);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
243 char *temp2 = Dowa_Arena_Allocate(arena, 256);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
244 snprintf(temp2, 256, "%zu", hg_response->body_length);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
245
190
a2725419f988 Updated so that bun builds will with already existing js files.
MrJuneJune <me@mrjunejune.com>
parents: 188
diff changeset
246 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
247 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
248 Dowa_HashMap_Push_Arena(resp, "body", temp1, arena);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
249 Dowa_HashMap_Push_Arena(resp, "content-length", temp2, arena);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
250
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
251 return resp;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
252 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
253
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
254 Seobeo_Request_Entry* ApiGetReadme(Seobeo_Request_Entry *req, Dowa_Arena *arena) {
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
255 return ApiGetFile(req, arena);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
256 }
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
257
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
258 // Streaming handler for hg wire protocol - pipes data directly without buffering
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
259 void StreamHgWireProtocol(Seobeo_Handle *p_client, Seobeo_Request_Entry *req, Dowa_Arena *arena)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
260 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
261 void *method_kv = Dowa_HashMap_Get_Ptr(req, "HTTP_Method");
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
262 const char *method = method_kv ? ((Seobeo_Request_Entry*)method_kv)->value : "GET";
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
263
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
264 void *query_kv = Dowa_HashMap_Get_Ptr(req, "QueryString");
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
265 const char *query_string = query_kv ? ((Seobeo_Request_Entry*)query_kv)->value : "";
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
266
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
267 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
268 const char *req_body = body_kv ? ((Seobeo_Request_Entry*)body_kv)->value : "";
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
269
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
270 const char *hg_custom = req[7].value;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
271
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
272 Seobeo_Log(SEOBEO_DEBUG, "HG Stream Proxy: method=%s query=%s\n", method, query_string);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
273
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
274 // THINKING: Connect to hg serve
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
275 // This kinda blows, but not a good way to handle it since my client API assumes it is all stored in
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
276 // buffer and what not.
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
277 Seobeo_Handle *p_upstream = Seobeo_Stream_Handle_Client_Create(HG_SERVE_HOST, HG_SERVE_PORT, FALSE);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
278 if (!p_upstream || p_upstream->socket < 0)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
279 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
280 const char *err_resp = "HTTP/1.1 502 Bad Gateway\r\nContent-Length: 26\r\n\r\nFailed to connect upstream";
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
281 Seobeo_Handle_Queue(p_client, (uint8*)err_resp, strlen(err_resp));
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
282 Seobeo_Handle_Flush(p_client);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
283 if (p_upstream)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
284 Seobeo_Handle_Destroy(p_upstream);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
285 return;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
286 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
287
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
288 // Create headers
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
289 // we only allow x-hgarg-1 and content-length
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
290 char request_buf[8192];
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
291 int req_len = snprintf(request_buf, sizeof(request_buf),
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
292 "%s /?%s HTTP/1.1\r\n"
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
293 "Host: %s:%s\r\n"
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
294 "User-Agent: Seobeo/1.0\r\n"
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
295 "Connection: close\r\n",
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
296 method, query_string, HG_SERVE_HOST, HG_SERVE_PORT);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
297
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
298 if (hg_custom && hg_custom[0] != '\0')
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
299 req_len += snprintf(request_buf + req_len, sizeof(request_buf) - req_len, "x-hgarg-1: %s\r\n", hg_custom);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
300
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
301 if (req_body && req_body[0] != '\0')
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
302 req_len += snprintf(request_buf + req_len, sizeof(request_buf) - req_len, "Content-Length: %zu\r\n\r\n%s", strlen(req_body), req_body);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
303 else
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
304 req_len += snprintf(request_buf + req_len, sizeof(request_buf) - req_len, "\r\n");
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
305
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
306 Seobeo_Handle_Queue(p_upstream, (uint8*)request_buf, req_len);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
307 if (Seobeo_Handle_Flush(p_upstream) < 0)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
308 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
309 const char *err_resp = "HTTP/1.1 502 Bad Gateway\r\nContent-Length: 21\r\n\r\nUpstream write failed";
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
310 Seobeo_Handle_Queue(p_client, (uint8*)err_resp, strlen(err_resp));
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
311 Seobeo_Handle_Flush(p_client);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
312 Seobeo_Handle_Destroy(p_upstream);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
313 return;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
314 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
315
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
316 // Responses
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
317 while (1)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
318 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
319 int r = Seobeo_Handle_Read(p_upstream);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
320 if (r < 0)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
321 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
322 Seobeo_Handle_Destroy(p_upstream);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
323 return;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
324 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
325 if (p_upstream->read_buffer_len >= 4 &&
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
326 strstr((char*)p_upstream->read_buffer, "\r\n\r\n") != NULL)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
327 break;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
328 if (r == 0)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
329 continue;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
330 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
331
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
332 // TODO: Maybe make this into a separate function instead of internal function as doing this over and over again blows.
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
333 char *hdr_end = strstr((char*)p_upstream->read_buffer, "\r\n\r\n");
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
334 if (!hdr_end)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
335 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
336 Seobeo_Handle_Destroy(p_upstream);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
337 return;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
338 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
339 size_t hdr_len = hdr_end - (char*)p_upstream->read_buffer + 4;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
340 Seobeo_Handle_Queue(p_client, p_upstream->read_buffer, hdr_len);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
341 Seobeo_Handle_Flush(p_client);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
342
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
343 // All body
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
344 size_t body_in_buffer = p_upstream->read_buffer_len - hdr_len;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
345 if (body_in_buffer > 0)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
346 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
347 Seobeo_Handle_Queue(p_client, p_upstream->read_buffer + hdr_len, body_in_buffer);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
348 Seobeo_Handle_Flush(p_client);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
349 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
350 Seobeo_Handle_Consume(p_upstream, p_upstream->read_buffer_len);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
351 while (1)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
352 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
353 int n = Seobeo_Handle_Read(p_upstream);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
354 if (n > 0)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
355 {
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
356 Seobeo_Handle_Queue(p_client, p_upstream->read_buffer, p_upstream->read_buffer_len);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
357 Seobeo_Handle_Flush(p_client);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
358 Seobeo_Handle_Consume(p_upstream, p_upstream->read_buffer_len);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
359 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
360 else if (n == -2)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
361 break;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
362 else if (n < 0)
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
363 break;
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
364 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
365
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
366 Seobeo_Handle_Destroy(p_upstream);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
367 }
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
368
108
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
369 Seobeo_Request_Entry* ApiHgWireProtocol(Seobeo_Request_Entry *req, Dowa_Arena *arena)
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
370 {
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
371 Seobeo_Request_Entry *resp = NULL;
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
372
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
373 void *method_kv = Dowa_HashMap_Get_Ptr(req, "HTTP_Method");
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
374 const char *method = method_kv ? ((Seobeo_Request_Entry*)method_kv)->value : "GET";
108
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
375
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
376 void *query_kv = Dowa_HashMap_Get_Ptr(req, "QueryString");
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
377 const char *query_string = query_kv ? ((Seobeo_Request_Entry*)query_kv)->value : "";
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
378
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
379 void *body_kv = Dowa_HashMap_Get_Ptr(req, "Body");
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
380 const char *req_body = body_kv ? ((Seobeo_Request_Entry*)body_kv)->value : "";
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
381 size_t body_len = strlen(req_body);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
382
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
383 const char *hg_custom = req[7].value;
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
384 Seobeo_Log(SEOBEO_DEBUG, "HG Proxy: method=%s query=%s body_len=%zu\n", method, query_string, body_len);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
385
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
386 Seobeo_Client_Response *hg_response;
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
387
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
388 char hg_path[MAX_PATH];
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
389 snprintf(hg_path, sizeof(hg_path), "/?%s", query_string);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
390
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
391 hg_response = hg_proxy_request(method, hg_path, req_body, hg_custom);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
392
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
393 Seobeo_Log(SEOBEO_DEBUG, "HG Proxy: received %zu bytes\n", hg_response->body_length);
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
394
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
395 Seobeo_Request_Entry *kv = Dowa_HashMap_Get_Ptr(hg_response->headers, "Content-Type");
108
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
396
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
397 char *status = Dowa_Arena_Allocate(arena, 5);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
398 snprintf(status, 4, "%i", hg_response->status_code);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
399
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
400 // Use binary-safe copy to handle null bytes in mercurial bundle data
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
401 char *temp1 = Dowa_Arena_Copy(arena, hg_response->body, hg_response->body_length);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
402 char *temp2 = Dowa_Arena_Allocate(arena, 256);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
403 snprintf(temp2, 256, "%zu", hg_response->body_length);
108
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
404
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
405 Dowa_HashMap_Push_Arena(resp, "status", status, arena);
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
406 Dowa_HashMap_Push_Arena(resp, "content-type", kv->value, arena);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
407 Dowa_HashMap_Push_Arena(resp, "body", temp1, arena);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
408 Dowa_HashMap_Push_Arena(resp, "content-length", temp2, arena);
135
ffb764d2fcc5 [HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents: 109
diff changeset
409
147
6de849867459 [HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents: 135
diff changeset
410 return resp;
108
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
411 }
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
412
193
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
413 Seobeo_Request_Entry* GetReactHome(Seobeo_Request_Entry *req, Dowa_Arena *arena)
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
414 {
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
415 size_t file_size = 0;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
416 char *html = Seobeo_Web_LoadFile("/index.html", &file_size);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
417
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
418 printf("%s", html);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
419 Seobeo_Request_Entry *resp = NULL;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
420 Dowa_HashMap_Push_Arena(resp, "status", "200", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
421 Dowa_HashMap_Push_Arena(resp, "content-type", "text/html", arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
422 Dowa_HashMap_Push_Arena(resp, "body", html, arena);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
423 return resp;
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
424 }
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
425
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
426 int main(void) {
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
427 Seobeo_Router_Init();
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
428
193
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
429
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
430 Seobeo_Router_Register("GET", "/", GetReactHome);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
431 Seobeo_Router_Register("GET", "/directories", GetReactHome);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
432 Seobeo_Router_Register("GET", "/graph", GetReactHome);
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
433
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
434 Seobeo_Router_Register("GET", "/api/repo/list", ApiListDirectory);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
435 Seobeo_Router_Register("GET", "/api/repo/file", ApiGetFile);
193
9f4429c49733 [HgWeb] Making progress....
MrJuneJune <me@mrjunejune.com>
parents: 190
diff changeset
436 Seobeo_Router_Register("GET", "/api/graph/:graph_id", ApiGetGraph);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
437 Seobeo_Router_Register("GET", "/api/repo/readme", ApiGetReadme);
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
438
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
439 // Use streaming handler for hg wire protocol...
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
440 Seobeo_Router_Register_Stream("GET", "/repo", StreamHgWireProtocol);
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
441 Seobeo_Router_Register_Stream("POST", "/repo", StreamHgWireProtocol);
108
f07abbcd2ec5 [HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents: 107
diff changeset
442
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
443 printf("Starting on Port 6970...\n");
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
444
175
71ad34a8bc9a [HgWeb] Can stream hg response now. Added react page for hg web since we use json anyway.
MrJuneJune <me@mrjunejune.com>
parents: 147
diff changeset
445 int result = Seobeo_Web_Server_Start("hg-web/src", "6970", SEOBEO_MODE_EDGE, 1);
104
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
446
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
447 Seobeo_Router_Destroy();
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
448
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
449 return result;
2301aeb7503b [Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff changeset
450 }