mirror of https://github.com/koreader/koreader
commit
31d4b4674f
@ -1 +1 @@
|
|||||||
Subproject commit 9aa76dc818c7d874e9dd09a903722915be63af09
|
Subproject commit 7025830053c47496db413802375236300eaf4e6e
|
@ -0,0 +1,52 @@
|
|||||||
|
local UIManager = require("ui/uimanager")
|
||||||
|
local DEBUG = require("dbg")
|
||||||
|
|
||||||
|
local HTTPClient = {
|
||||||
|
headers = {},
|
||||||
|
input_timeouts = 0,
|
||||||
|
INPUT_TIMEOUT = 100*1000,
|
||||||
|
}
|
||||||
|
|
||||||
|
function HTTPClient:new()
|
||||||
|
local o = {}
|
||||||
|
setmetatable(o, self)
|
||||||
|
self.__index = self
|
||||||
|
return o
|
||||||
|
end
|
||||||
|
|
||||||
|
function HTTPClient:addHeader(header, value)
|
||||||
|
self.headers[header] = value
|
||||||
|
end
|
||||||
|
|
||||||
|
function HTTPClient:removeHeader(header)
|
||||||
|
self.headers[header] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function HTTPClient:request(request, response_callback, error_callback)
|
||||||
|
request.on_headers = function(headers)
|
||||||
|
for header, value in pairs(self.headers) do
|
||||||
|
headers[header] = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
request.connect_timeout = 10
|
||||||
|
request.request_timeout = 20
|
||||||
|
UIManager:initLooper()
|
||||||
|
UIManager:handleTask(function()
|
||||||
|
-- avoid endless waiting for input
|
||||||
|
UIManager.INPUT_TIMEOUT = self.INPUT_TIMEOUT
|
||||||
|
self.input_timeouts = self.input_timeouts + 1
|
||||||
|
local turbo = require("turbo")
|
||||||
|
local res = coroutine.yield(
|
||||||
|
turbo.async.HTTPClient():fetch(request.url, request))
|
||||||
|
-- reset INPUT_TIMEOUT to nil when all HTTP requests are fullfilled.
|
||||||
|
self.input_timeouts = self.input_timeouts - 1
|
||||||
|
UIManager.INPUT_TIMEOUT = self.input_timeouts > 0 and self.INPUT_TIMEOUT or nil
|
||||||
|
if res.error and error_callback then
|
||||||
|
error_callback(res)
|
||||||
|
elseif response_callback then
|
||||||
|
response_callback(res)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
return HTTPClient
|
@ -0,0 +1,36 @@
|
|||||||
|
require("commonrequire")
|
||||||
|
local UIManager = require("ui/uimanager")
|
||||||
|
local HTTPClient = require("httpclient")
|
||||||
|
local DEBUG = require("dbg")
|
||||||
|
--DEBUG:turnOn()
|
||||||
|
|
||||||
|
describe("HTTP client module", function()
|
||||||
|
local requests = 0
|
||||||
|
local function response_callback(res)
|
||||||
|
requests = requests - 1
|
||||||
|
if requests == 0 then UIManager:quit() end
|
||||||
|
assert(res.body)
|
||||||
|
end
|
||||||
|
local function error_callback(res)
|
||||||
|
requests = requests - 1
|
||||||
|
if requests == 0 then UIManager:quit() end
|
||||||
|
assert(false, "error occurs")
|
||||||
|
end
|
||||||
|
local async_client = HTTPClient:new()
|
||||||
|
it("should get response from async GET request", function()
|
||||||
|
UIManager:quit()
|
||||||
|
local urls = {
|
||||||
|
"http://www.example.com",
|
||||||
|
"http://www.example.org",
|
||||||
|
"https://www.example.com",
|
||||||
|
"https://www.example.org",
|
||||||
|
}
|
||||||
|
requests = #urls
|
||||||
|
for _, url in ipairs(urls) do
|
||||||
|
async_client:request({
|
||||||
|
url = url,
|
||||||
|
}, response_callback, error_callback)
|
||||||
|
end
|
||||||
|
UIManager:runForever()
|
||||||
|
end)
|
||||||
|
end)
|
Loading…
Reference in New Issue