--!parent
--!encoding=utf-8
--****************************************************************************
-- @file LSW CORE LIB: CURL
-- @author Valentin Schmidt
-- @version 0.2
-- @requires xtra("Curl")
--****************************************************************************
property $
property _DetachClass
----------------------------------------
-- @constructor
----------------------------------------
on new (me)
$.loadXtras(me.libdir, ["Curl.x32"], ["CurlXtra.xtra"])
$.import("detacher")
$.import("string")
-- LOAD EXTENSIONS
$.inherit(me, $.include(me.libdir&"curlopt.ls"))
$.inherit(me, $.include(me.libdir&"curlinfo.ls"))
$.inherit(me, $.include(me.libdir&"curlform.ls"))
-- LOAD "DETACH" HELPER CLASS
me._DetachClass = $.include(me.libdir&"detach.ls")
return me
end
----------------------------------------
-- FACTORY METHOD
-- @return {instance} Curl handle (xtra instance)
----------------------------------------
on init (me)
return xtra("Curl").new()
end
----------------------------------------
-- Used for "detaching" xtra callbacks from original thread,
-- so scripting errors in the callback's code don't fail silently
-- @param {instance} ch - Curl handle
-- @param {symbol} cbHandler - Callback handler
-- @param {object} [cbTarget=_movie] - Callback target
-- @param {bool} [passImmediately=false] - If specified, received data chunks are passed to callback immediately
-- @return {integer} Curl multi error code (0 = no error)
----------------------------------------
on execAsyncDetached (me, ch, cbHandler, cbTarget, passImmediately, customData)
if voidP(cbTarget) then cbTarget = _movie
obj = me._DetachClass.new(cbHandler, cbTarget, ch, customData)
return ch.execAsync(#_detach, obj, passImmediately)
end
----------------------------------------
--
----------------------------------------
on setHeaderCallbackDetached (me, ch, cbHandler, cbTarget)--, passImmediately, customData)
if voidP(cbTarget) then cbTarget = _movie
obj = me._DetachClass.new(cbHandler, cbTarget, ch)--, customData)
return ch.setHeaderCallback(#_detach, obj)
end
----------------------------------------
--
----------------------------------------
on setProgressCallbackDetached (me, ch, cbHandler, cbTarget, customData)
if voidP(cbTarget) then cbTarget = _movie
obj = me._DetachClass.new(cbHandler, cbTarget, ch, customData)
return ch.setProgressCallback(#_detachProgress, obj)
end
----------------------------------------
-- Generates URL-encoded query string
-- @param {propList} param_obj
-- @return {string}
----------------------------------------
on httpBuildQuery (me, param_obj)
query_str = ""
cnt = count(param_obj)
repeat with i = 1 to cnt
put param_obj.getPropAt(i)&"="&curl_escape(param_obj[i])&"&" after query_str
end repeat
delete the last char of query_str
return query_str
end
----------------------------------------
-- Parse HTTP result headers
-- @param {string} headerStr
-- @return {propList}
----------------------------------------
on parseHeaders (me, resultStr)
headerSep = $.CRLF&$.CRLF
lineSep = $.CRLF
parts = $.string.explode(headerSep, resultStr, 2)
headerStr = parts[1]
lines = $.string.explode(lineSep, headerStr)
statusLine = lines[1]
if not (statusLine contains ":") then
statusCode = integer(statusLine.word[2]) -- TODO
lines.deleteAt(1)
end if
headers = [:]
repeat with s in lines
if not (s contains ":") then next repeat
parts = $.string.explode(":", s, 2)
k = parts[1]
v = parts[2]
if v starts " " then delete char 1 of v
--headers[k] = v
headers.addProp(k, v)
end repeat
--return headers
return [#status:statusCode, #headers:headers]
end