diff --git a/internal/builtins/http.go b/internal/builtins/http.go index 471cd11..82bab2e 100644 --- a/internal/builtins/http.go +++ b/internal/builtins/http.go @@ -178,6 +178,7 @@ func starlarkResponse(res *http.Response) *starlarkstruct.Struct { "code": starlark.MakeInt(res.StatusCode), "headers": starlarkStringSliceMap(res.Header), "body": reader, + "url": starlark.String(res.Request.URL.String()), "json": starlark.NewBuiltin("response.json", func(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { return reader.readJSON(thread, b, args, kwargs) }), diff --git a/internal/convert/convert.go b/internal/convert/convert.go index 4a1c75a..2deadfb 100644 --- a/internal/convert/convert.go +++ b/internal/convert/convert.go @@ -23,8 +23,16 @@ func Convert(v any) (starlark.Value, error) { } func convert(val reflect.Value) (starlark.Value, error) { + // Check for invalid or nil values + if !val.IsValid() { + return starlark.None, nil + } + switch val.Kind() { case reflect.Interface: + if val.IsNil() { + return starlark.None, nil + } return convert(val.Elem()) case reflect.Int, reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8: return starlark.MakeInt64(val.Int()), nil @@ -37,9 +45,20 @@ func convert(val reflect.Value) (starlark.Value, error) { case reflect.String: return starlark.String(val.String()), nil case reflect.Slice, reflect.Array: + if val.IsNil() { + return starlark.None, nil + } return convertSlice(val) case reflect.Map: + if val.IsNil() { + return starlark.None, nil + } return convertMap(val) + case reflect.Ptr: + if val.IsNil() { + return starlark.None, nil + } + return convert(val.Elem()) default: return nil, fmt.Errorf("%w: %s", ErrInvalidType, val.Type()) }