MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

whoops, @ would segfault fetch module

+34 -18
+34 -18
src/modules/fetch.c
··· 77 77 jsval_t err = js_mkstr(req->js, req->error_msg ? req->error_msg : "Unknown error", req->error_msg ? strlen(req->error_msg) : 13); 78 78 js_reject_promise(req->js, req->promise, err); 79 79 } else { 80 - jsval_t response = create_response(req->js, req->status_code, req->response_buffer.data, req->response_buffer.size); 80 + const char *body = req->response_buffer.data ? req->response_buffer.data : ""; 81 + size_t body_len = req->response_buffer.data ? req->response_buffer.size : 0; 82 + jsval_t response = create_response(req->js, req->status_code, body, body_len); 81 83 js_resolve_promise(req->js, req->promise, response); 82 84 } 83 85 ··· 185 187 if (!pending_requests) utarray_new(pending_requests, &ut_ptr_icd); 186 188 utarray_push_back(pending_requests, &req); 187 189 188 - struct tlsuv_url_s parsed_url; 189 - if (tlsuv_parse_url(&parsed_url, url_str) != 0) { 190 - jsval_t err = js_mkstr(js, "Failed to parse URL", 19); 190 + const char *scheme_end = strstr(url_str, "://"); 191 + if (!scheme_end) { 192 + jsval_t err = js_mkstr(js, "Invalid URL: no scheme", 22); 191 193 js_reject_promise(js, promise, err); 192 194 remove_pending_request(req); 193 195 free_fetch_request(req); 194 196 return js_mkundef(); 195 197 } 196 198 197 - size_t host_len = (parsed_url.path - parsed_url.hostname) + parsed_url.hostname_len; 198 - char *host_url = calloc(1, host_len + parsed_url.scheme_len + 4); 199 + const char *host_start = scheme_end + 3; 200 + const char *path_start = strchr(host_start, '/'); 201 + const char *at_in_host = NULL; 199 202 200 - snprintf( 201 - host_url, host_len + parsed_url.scheme_len + 4, "%.*s://%.*s", 202 - (int)parsed_url.scheme_len, parsed_url.scheme, (int)parsed_url.hostname_len, parsed_url.hostname) 203 - ; 203 + for (const char *p = host_start; p < (path_start ? path_start : host_start + strlen(host_start)); p++) { 204 + if (*p == '@') at_in_host = p; 205 + } 206 + if (at_in_host) host_start = at_in_host + 1; 204 207 205 - if (parsed_url.port > 0 && !((parsed_url.port == 80 && strncmp(parsed_url.scheme, "http", 4) == 0) || (parsed_url.port == 443 && strncmp(parsed_url.scheme, "https", 5) == 0))) { 206 - char port_str[16]; 207 - snprintf(port_str, sizeof(port_str), ":%d", parsed_url.port); 208 - strcat(host_url, port_str); 208 + size_t scheme_len = scheme_end - url_str; 209 + size_t host_len = path_start ? (size_t)(path_start - host_start) : strlen(host_start); 210 + const char *path = path_start ? path_start : "/"; 211 + 212 + if (host_len == 0) { 213 + jsval_t err = js_mkstr(js, "Invalid URL: no host", 20); 214 + js_reject_promise(js, promise, err); 215 + remove_pending_request(req); 216 + free_fetch_request(req); 217 + return js_mkundef(); 209 218 } 210 219 220 + char *host_url = calloc(1, scheme_len + 3 + host_len + 1); 221 + if (!host_url) { 222 + jsval_t err = js_mkstr(js, "Out of memory", 13); 223 + js_reject_promise(js, promise, err); 224 + remove_pending_request(req); 225 + free_fetch_request(req); 226 + return js_mkundef(); 227 + } 228 + snprintf(host_url, scheme_len + 3 + host_len + 1, "%.*s://%.*s", (int)scheme_len, url_str, (int)host_len, host_start); 229 + 211 230 int rc = tlsuv_http_init(fetch_loop, &req->http_client, host_url); 212 231 free(host_url); 213 232 ··· 239 258 } 240 259 } 241 260 242 - char *path = parsed_url.path_len > 0 ? strndup(parsed_url.path, parsed_url.path_len) : strdup("/"); 243 261 req->http_req = tlsuv_http_req(&req->http_client, method, path, resp_cb, req); 244 - free(path); 245 262 246 263 if (!req->http_req) { 247 264 jsval_t err = js_mkstr(js, "Failed to create HTTP request", 30); ··· 270 287 char *value_str = js_getstr(js, value, NULL); 271 288 if (value_str) { 272 289 char *key_str = strndup(key, key_len); 273 - tlsuv_http_req_header(req->http_req, key_str, value_str); 274 - free(key_str); 290 + if (key_str) { tlsuv_http_req_header(req->http_req, key_str, value_str); free(key_str); } 275 291 } 276 292 } 277 293 js_prop_iter_end(&iter);