// internal/functions/http_functions.go
func (r *GojaRuntime) httpFetch(call goja.FunctionCall) goja.Value {
if len(call.ArgumentList) < 1 {
return goja.Undefined()
}
url := call.Argument(0).String()
// Optional method (default GET)
method := "GET"
if len(call.ArgumentList) > 1 {
method = call.Argument(1).String()
}
// Optional headers
headers := make(map[string]string)
if len(call.ArgumentList) > 2 {
headersArg, _ := call.Argument(2).Export()
if h, ok := headersArg.(map[string]interface{}); ok {
for k, v := range h {
headers[k] = fmt.Sprintf("%v", v)
}
}
}
// Make request
req, err := http.NewRequest(method, url, nil)
if err != nil {
return goja.Undefined()
}
for k, v := range headers {
req.Header.Set(k, v)
}
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Do(req)
if err != nil {
return goja.Undefined()
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
result := map[string]interface{}{
"status": resp.StatusCode,
"body": string(body),
"headers": resp.Header,
}
value, _ := r.vm.ToValue(result)
return value
}