diff options
| author | Philipp Tanlak <philipp.tanlak@gmail.com> | 2023-11-02 18:37:11 +0100 |
|---|---|---|
| committer | Philipp Tanlak <philipp.tanlak@gmail.com> | 2023-11-02 18:37:11 +0100 |
| commit | d2090061c13aff4647999b1d8725f774c9fe599b (patch) | |
| tree | f323a298a507ed116245abe497f3e8c55d6b24c0 /js_lib.go | |
| parent | aadd80b3b213988aa5701075f2650198e4066349 (diff) | |
Refactor stdlib to more generic functions
Diffstat (limited to 'js_lib.go')
| -rw-r--r-- | js_lib.go | 109 |
1 files changed, 79 insertions, 30 deletions
@@ -5,6 +5,8 @@ package flyscrape import ( + "bytes" + "encoding/json" "fmt" "io" "net/http" @@ -15,57 +17,104 @@ import ( func NewJSLibrary(client *http.Client) Imports { return Imports{ "flyscrape": map[string]any{ - "fetchDocument": jsFetchDocument(client), - "submitForm": jsSubmitForm(client), + "parse": jsParse(), + }, + "flyscrape/http": map[string]any{ + "get": jsHTTPGet(client), + "postForm": jsHTTPPostForm(client), + "postJSON": jsHTTPPostJSON(client), }, } } -func jsFetchDocument(client *http.Client) func(url string) map[string]any { - return func(url string) map[string]any { - resp, err := client.Get(url) +func jsParse() func(html string) map[string]any { + return func(html string) map[string]any { + doc, err := DocumentFromString(html) if err != nil { return nil } - defer resp.Body.Close() - - var b strings.Builder - if _, err := io.Copy(&b, resp.Body); err != nil { - return nil - } + return doc + } +} - doc, err := DocumentFromString(b.String()) +func jsHTTPGet(client *http.Client) func(url string) map[string]any { + return func(url string) map[string]any { + req, err := http.NewRequest("GET", url, nil) if err != nil { - return nil + return map[string]any{"error": err.Error()} } - - return doc + return jsFetch(client, req) } } -func jsSubmitForm(client *http.Client) func(url string, data map[string]any) map[string]any { - return func(url string, data map[string]any) map[string]any { - form := gourl.Values{} - for k, v := range data { - form.Set(k, fmt.Sprintf("%v", v)) +func jsHTTPPostForm(client *http.Client) func(url string, form map[string]any) map[string]any { + return func(url string, form map[string]any) map[string]any { + vals := gourl.Values{} + for k, v := range form { + switch v := v.(type) { + case []any: + for _, v := range v { + vals.Add(k, fmt.Sprintf("%v", v)) + } + default: + vals.Add(k, fmt.Sprintf("%v", v)) + } } - resp, err := client.PostForm(url, form) + req, err := http.NewRequest("POST", url, strings.NewReader(vals.Encode())) if err != nil { - return nil + return map[string]any{"error": err.Error()} } - defer resp.Body.Close() + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - var b strings.Builder - if _, err := io.Copy(&b, resp.Body); err != nil { - return nil - } + return jsFetch(client, req) + } +} + +func jsHTTPPostJSON(client *http.Client) func(url string, data any) map[string]any { + return func(url string, data any) map[string]any { + b, _ := json.Marshal(data) - doc, err := DocumentFromString(b.String()) + req, err := http.NewRequest("POST", url, bytes.NewReader(b)) if err != nil { - return nil + return map[string]any{"error": err.Error()} } + req.Header.Set("Content-Type", "application/json") - return doc + return jsFetch(client, req) + } +} + +func jsFetch(client *http.Client, req *http.Request) (obj map[string]any) { + obj = map[string]any{ + "body": "", + "status": 0, + "headers": map[string]any{}, + "error": "", + } + + resp, err := client.Do(req) + if err != nil { + obj["error"] = err.Error() + return + } + defer resp.Body.Close() + + obj["status"] = resp.StatusCode + + b, err := io.ReadAll(resp.Body) + if err != nil { + obj["error"] = err.Error() + return } + + obj["body"] = string(b) + + headers := map[string]any{} + for name := range resp.Header { + headers[name] = resp.Header.Get(name) + } + obj["headers"] = headers + + return } |