Mercurial
annotate hg-web/main.c @ 174:1ba8c1df082c hg-web
Remove playground stuff.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Mon, 19 Jan 2026 18:59:23 -0800 |
| parents | 6de849867459 |
| children | 71ad34a8bc9a |
| 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 { |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
22 char *empty = Dowa_Arena_Allocate(arena, 1); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
23 empty[0] = '\0'; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
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 { |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
33 if (input_path[i] == '.' && (i == 0 || input_path[i-1] == '/')) { |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
34 if (i + 1 < len && input_path[i+1] == '.') { |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
35 // Skip ".." |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
36 i++; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
37 continue; |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
38 } |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
39 // Skip "." |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
40 continue; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
41 } |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
42 result[j++] = input_path[i]; |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
43 } |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
44 result[j] = '\0'; |
|
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 // Remove leading/trailing slashes |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
47 while (result[0] == '/') |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
48 memmove(result, result + 1, strlen(result)); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
49 while (j > 0 && result[j-1] == '/') |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
50 result[--j] = '\0'; |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
51 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
52 return result; |
|
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 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
55 Seobeo_Client_Response *hg_proxy_request( |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
56 const char *method, |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
57 const char *path, |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
58 const char *req_body) |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
59 { |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
60 char full_path[MAX_PATH]; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
61 snprintf(full_path, MAX_PATH, "http://%s:%s%s", HG_SERVE_HOST, HG_SERVE_PORT, path); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
62 Seobeo_Client_Request *p_req = Seobeo_Client_Request_Create(full_path); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
63 Seobeo_Client_Request_Add_Header_Array(p_req, "User-Agent: Seobeo/1.0 (Array Mode)"); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
64 Seobeo_Client_Request_Add_Header_Array(p_req, "Accept: application/json"); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
65 Seobeo_Client_Request_Add_Header_Array(p_req, "X-Test-Header: TestValue"); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
66 if (strcmp(method, "POST")) |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
67 Seobeo_Client_Request_Set_Method(p_req, "POST"); |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
68 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
69 Seobeo_Client_Request_Set_Body(p_req, req_body, 0); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
70 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
|
71 Seobeo_Client_Request_Destroy(p_req); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
72 return p_resp; |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
73 } |
|
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
74 |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
75 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
|
76 { |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
77 Seobeo_Request_Entry *resp = NULL; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
78 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
79 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
|
80 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
|
81 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
82 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
|
83 Seobeo_Url_Decode(decoded_path, rel_path); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
84 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
85 char *safe_path = sanitize_path(decoded_path, arena); |
| 106 | 86 |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
87 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
|
88 |
|
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
89 char hg_path[MAX_PATH]; |
|
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
90 if (strlen(safe_path) > 0) |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
91 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
|
92 else |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
93 snprintf(hg_path, sizeof(hg_path), "/file/tip/?style=json"); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
94 |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
95 Seobeo_Client_Response *hg_response = hg_proxy_request("GET", hg_path, NULL); |
| 106 | 96 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
97 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
|
98 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
99 char status[4]; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
100 snprintf(status, 3, "%i", hg_response->status_code); |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
101 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
102 if (hg_response->status_code != 200) |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
103 { |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
104 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
|
105 Dowa_HashMap_Push_Arena(resp, "status", "502", arena); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
106 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
|
107 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
|
108 return resp; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
109 } |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
110 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
111 Dowa_HashMap_Push_Arena(resp, "status", "200", arena); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
112 Dowa_HashMap_Push_Arena(resp, "content-type", "application/json", arena); |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
113 Dowa_HashMap_Push_Arena(resp, "body", hg_response->body, arena); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
114 Seobeo_Client_Response_Destroy(hg_response); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
115 return resp; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
116 } |
|
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 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
|
119 { |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
120 Seobeo_Request_Entry *resp = NULL; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
121 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
122 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
|
123 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
|
124 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
|
125 Seobeo_Url_Decode(decoded_path, rel_path); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
126 char *safe_path = sanitize_path(decoded_path, arena); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
127 |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
128 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
|
129 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
130 if (strlen(safe_path) == 0) |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
131 { |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
132 Dowa_HashMap_Push_Arena(resp, "status", "400", arena); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
133 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
|
134 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
|
135 return resp; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
136 } |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
137 |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
138 char hg_path[MAX_PATH]; |
|
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
139 snprintf(hg_path, sizeof(hg_path), "/raw-file/tip/%s", safe_path); |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
140 Seobeo_Client_Response *hg_response = hg_proxy_request("GET", hg_path, NULL); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
141 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
142 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
|
143 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
144 char status[4]; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
145 snprintf(status, 3, "%i", hg_response->status_code); |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
146 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
147 if (!hg_response->body) |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
148 { |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
149 Dowa_HashMap_Push_Arena(resp, "status", "502", arena); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
150 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
|
151 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
|
152 return resp; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
153 } |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
154 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
155 if (hg_response->status_code != 200) |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
156 { |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
157 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
|
158 Dowa_HashMap_Push_Arena(resp, "status", status, arena); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
159 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
|
160 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
|
161 return resp; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
162 } |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
163 |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
164 Dowa_HashMap_Push_Arena(resp, "status", status, arena); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
165 Dowa_HashMap_Push_Arena(resp, "content-type", "text/plain", arena); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
166 Dowa_HashMap_Push_Arena(resp, "body", hg_response->body, arena); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
167 Seobeo_Client_Response_Destroy(hg_response); |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
168 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
169 return resp; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
170 } |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
171 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
172 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
|
173 return ApiGetFile(req, arena); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
174 } |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
175 |
|
108
f07abbcd2ec5
[HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents:
107
diff
changeset
|
176 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
|
177 { |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
178 Seobeo_Request_Entry *resp = NULL; |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
179 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
180 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
|
181 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
|
182 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
183 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
|
184 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
|
185 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
186 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
|
187 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
|
188 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
|
189 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
190 Seobeo_Log(SEOBEO_DEBUG, "HG Proxy: method=%s query=%s body_len=%zu\n", method, query_string, body_len); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
191 Seobeo_Client_Response *hg_response; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
192 if (strlen(query_string) > 0) |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
193 { |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
194 char temp_path[MAX_PATH]; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
195 snprintf(temp_path, MAX_PATH, "?%s", query_string); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
196 hg_response = hg_proxy_request(method, query_string, req_body); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
197 } |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
198 else |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
199 hg_response = hg_proxy_request(method, "", req_body); |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
200 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
201 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
|
202 |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
203 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
|
204 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
205 char status[4]; |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
206 snprintf(status, 3, "%i", hg_response->status_code); |
|
108
f07abbcd2ec5
[HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents:
107
diff
changeset
|
207 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
208 Dowa_HashMap_Push_Arena(resp, "status", status, arena); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
209 Dowa_HashMap_Push_Arena(resp, "content-type", kv ? kv->value : "", arena); |
|
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
210 Dowa_HashMap_Push_Arena(resp, "body", hg_response->body, arena); |
|
135
ffb764d2fcc5
[HgWeb] Updated hg web so it works
June Park <parkjune1995@gmail.com>
parents:
109
diff
changeset
|
211 |
|
147
6de849867459
[HgWeb] Updated logic to use Seobeo Client.
June Park <parkjune1995@gmail.com>
parents:
135
diff
changeset
|
212 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
|
213 } |
|
f07abbcd2ec5
[HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents:
107
diff
changeset
|
214 |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
215 int main(void) { |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
216 Seobeo_Router_Init(); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
217 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
218 Seobeo_Router_Register("GET", "/api/repo/list", ApiListDirectory); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
219 Seobeo_Router_Register("GET", "/api/repo/file", ApiGetFile); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
220 Seobeo_Router_Register("GET", "/api/repo/readme", ApiGetReadme); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
221 |
|
108
f07abbcd2ec5
[HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents:
107
diff
changeset
|
222 Seobeo_Router_Register("GET", "/repo", ApiHgWireProtocol); |
|
f07abbcd2ec5
[HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents:
107
diff
changeset
|
223 Seobeo_Router_Register("POST", "/repo", ApiHgWireProtocol); |
|
f07abbcd2ec5
[HgWeb] Will probably hold off on using it since it is not urgent.
June Park <parkjune1995@gmail.com>
parents:
107
diff
changeset
|
224 |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
225 printf("Starting on Port 6970...\n"); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
226 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
227 int result = Seobeo_Web_Server_Start("hg-web/src", "6970", SEOBEO_MODE_EDGE, 4); |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
228 |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
229 Seobeo_Router_Destroy(); |
|
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 return result; |
|
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
232 } |