
# `http`

Requests never block the game: the callback fires later on the client thread with a response
table, or with `nil` and an error message when the request fails at the network level (an HTTP
error status is still a response — check `ok`). Callbacks of an unloaded script are dropped.

| Function | Does |
|----------|------|
| `http.get(url, callback[, headers])` | `GET` request |
| `http.post(url, body, callback[, headers])` | `POST` request with a string body |
| `http.request(opts, callback)` | Any method: `opts = { url, method, body, headers, timeout }` |

`timeout` is in seconds (default `10`). Redirects are followed.

## Response

| Field | Value |
|-------|-------|
| `status` | HTTP status code |
| `ok` | `true` for `2xx` |
| `body` | Response body as a string |
| `headers` | Table of lowercased header names; repeated values joined with `, ` |

```lua
http.get("https://api.mojang.com/users/profiles/minecraft/Notch", function(res, err)
    if not res then
        kawaki.log("request failed: " .. err)
    elseif res.ok then
        kawaki.log(res.body)
    end
end)

http.request({
    url = "https://example.com/hook",
    method = "PUT",
    body = '{"hello":"world"}',
    headers = { ["Content-Type"] = "application/json" },
}, function(res) end)
```
