# HTTP support

### OTClientV8 HTTP protocol <a href="#user-content-otclientv8-http-protocol" id="user-content-otclientv8-http-protocol"></a>

OTClientV8 comes with HTTP/HTTPS and JSON support in lua.

#### Available functions <a href="#user-content-available-functions" id="user-content-available-functions"></a>

```
HTTP.get(url, callback)
HTTP.getJSON(url, callback) -- website should return json
HTTP.post(url, data, callback)
HTTP.postJSON(url, data, callback) -- data should be a table {} and website should return json
HTTP.download(url, file, downloadCallback, progressCallback) -- progressCallback can be null
HTTP.downloadImage(url, downloadImageCallback)
HTTP.cancel(operationId)
```

Each function, except `cancel` return operationId, you can use it to cancel http request. Those functions came from `modules/corelib/http.lua` and they use more advanced g\_http API. Files from download are available in virtual "/downloads" directory. Downloading of images is using cache based on url (so if you change image it won't refresh until restart or change url).

#### Callbacks <a href="#user-content-callbacks" id="user-content-callbacks"></a>

For get, getJSON, post and postJSON HTTP callback should look like this:

```
function callback(data, err)
    if err then
        -- handle error, if err is not null then err is a string
        return 
    end
    -- handle data
    -- if it's data from getJSON/postJSON then data is a table {}
end
```

For download:

```
function downloadCallback(path, checksum, err)
    if err then
        -- handle error, if err is not null then err is a string
        return 
    end
    -- do something with path and checksum
end

function progressCallback(progress, speed)
    -- progress is from 0 to 100
    -- speed is in kbps
end
```

For downloadImage:

```
function downloadImageCallback(path, err)
    if err then
        -- handle error, if err is not null then err is a string
        return 
    end
    -- do something with path to downloaded image
end
```

#### Support for images from base64 <a href="#user-content-support-for-images-from-base64" id="user-content-support-for-images-from-base64"></a>

If you want to load image from base64 there's special function for it: `Image:setImageSourceBase64(base64code)` You can find an example of that in `modules/client_news/news.lua`. Only PNG images are supported.

#### Timeout <a href="#user-content-timeout" id="user-content-timeout"></a>

Default timeout for every operations is 5s, you can change it in `modules/corelib/http.lua`.

#### Examples <a href="#user-content-examples" id="user-content-examples"></a>

There are few lua scripts using HTTP api:

```
modules/client_entergame/entergame.lua
modules/client_feedback/feedback.lua
modules/client_news/news.lua
modules/client_updater/updater.lua
modules/game_shop/shop.lua
```

Examples:

```
HTTP.get("https://api.ipify.org/", function(data, err)
    if err then
        g_logger.info("Whoops! Error occured: " .. err)
        return
    end
    g_logger.info("My IP is: " .. data)
end)

HTTP.getJSON("https://api.ipify.org/?format=json", function(data, err)
    if err then
        g_logger.info("Whoops! Error occured: " .. err)
        return
    end
    g_logger.info("My IP is: " .. tostring(data['ip']))
end)
```

#### Regex <a href="#user-content-regex" id="user-content-regex"></a>

If you're pro, there's also support for simple regex in lua which look like this:

```
let clients = new Set();

require('uWebSockets.js').App().ws('/*', {
  open: (ws, req) => {
    clients.add(ws);
  },
  message: (ws, message, isBinary) => {
    console.log("Message: " + message);
    let ok = ws.send(message, isBinary);
  },
  close: (ws, code, message) => {
    clients.delete(ws);
  }
}).any('/*', (res, req) => {
  /* Let's deny all Http */
  res.end('Nothing to see here!');  
}).listen(9000, (listenSocket) => {
  if (listenSocket) {
    console.log('Listening to port 9000');
  }
});


setInterval(() => {
    for(let client of clients) {
        client.send("hello", false);
    }    
}, 1000);
```
