1. -- parent script "CurlManager"
  2.  
  3. --****************************************************************************
  4. -- @file      Curl Manager Class for asynchronous requests (singleton)
  5. -- @author    Valentin Schmidt
  6. -- @requires  xtra("Curl"), script("CurlDetacher")
  7. --****************************************************************************
  8.  
  9. property CURLOPT
  10. property CURLINFO
  11. property CURLFORM
  12.  
  13. property _instance
  14.  
  15. ----------------------------------------
  16. -- @constructor (explicitely forced singleton class)
  17. ----------------------------------------
  18. on new (me)
  19.   if not voidP(me.script._instance) then return me.script._instance
  20.  
  21.   -- load constants
  22.   me._loadOptConstants()
  23.   me._loadInfoConstants()
  24.   me._loadFormConstants()
  25.  
  26.   me.script._instance = me
  27.   return me
  28. end
  29.  
  30. ----------------------------------------
  31. -- Factory function
  32. -- @return {instance} Curl handle (xtra instance)
  33. ----------------------------------------
  34. on init (me)
  35.   return xtra("Curl").new()
  36. end
  37.  
  38. ----------------------------------------
  39. -- Function for asynchronous Curl requests.
  40. -- It takes care of 2 things:
  41. -- a) Garbage collection is prevented for ongoing requests.
  42. -- b) The final callback is "detached" from the original xtra thread,
  43. --    so scripting errors in the callback's code don't fail silently.
  44. -- In addition, it also allows to specify arbitrary custom data which
  45. -- is then passed to the final callback handler.
  46. --
  47. -- @param {instance} ch - Curl handle
  48. -- @param {symbol} cbHandler - Callback handler
  49. -- @param {object} [cbTarget=_movie] - Callback target
  50. -- @param {integer} [returnMode=0] - 0=return error code, 1=return data, 2=return received chunks immediately
  51. -- @param {any} [customData=VOID] - If specified, this data will be passed back to the callback handler
  52. -- @return {integer} Curl multi error code (0 = no error)
  53. ----------------------------------------
  54. on execAsync (me, ch, cbHandler, cbTarget, returnMode, customData)
  55.   if voidP(cbTarget) then cbTarget = _movie
  56.   obj = script("CurlDetacher").new(cbHandler, cbTarget, ch, customData)
  57.   return ch.execAsync(#_detach, obj, returnMode)
  58. end
  59.  
  60. ----------------------------------------
  61. --
  62. ----------------------------------------
  63. on _loadOptConstants (me)
  64.  
  65.   -- see curl.h
  66.   opt = [:]
  67.   opt[#ACCEPT_ENCODING] = 10102
  68.   opt[#ACCEPTTIMEOUT_MS] = 212
  69.   opt[#ADDRESS_SCOPE] = 171
  70.   opt[#APPEND] = 50
  71.   opt[#AUTOREFERER] = 58
  72.   opt[#BUFFERSIZE] = 98
  73.   opt[#CAINFO] = 10065
  74.   opt[#CAPATH] = 10097
  75.   opt[#CERTINFO] = 172
  76.   opt[#CHUNK_BGN_FUNCTION] = 20198
  77.   opt[#CHUNK_DATA] = 10201
  78.   opt[#CHUNK_END_FUNCTION] = 20199
  79.   opt[#CLOSESOCKETDATA] = 10209
  80.   opt[#CLOSESOCKETFUNCTION] = 20208
  81.   opt[#CONNECT_ONLY] = 141
  82.   opt[#CONNECTTIMEOUT] = 78
  83.   opt[#CONNECTTIMEOUT_MS] = 156
  84.   opt[#CONV_FROM_NETWORK_FUNCTION] = 20142
  85.   opt[#CONV_FROM_UTF8_FUNCTION] = 20144
  86.   opt[#CONV_TO_NETWORK_FUNCTION] = 20143
  87.   opt[#COOKIE] = 10022
  88.   opt[#COOKIEFILE] = 10031
  89.   opt[#COOKIEJAR] = 10082
  90.   opt[#COOKIELIST] = 10135
  91.   opt[#COOKIESESSION] = 96
  92.   opt[#COPYPOSTFIELDS] = 10165
  93.   opt[#CRLF] = 27
  94.   opt[#CRLFILE] = 10169
  95.   opt[#CUSTOMREQUEST] = 10036
  96.   opt[#DEBUGDATA] = 10095
  97.   opt[#DEBUGFUNCTION] = 20094
  98.   opt[#DIRLISTONLY] = 48
  99.   opt[#DNS_CACHE_TIMEOUT] = 92
  100.   opt[#DNS_INTERFACE] = 10221
  101.   opt[#DNS_LOCAL_IP4] = 10222
  102.   opt[#DNS_LOCAL_IP6] = 10223
  103.   opt[#DNS_SERVERS] = 10211
  104.   opt[#EGDSOCKET] = 10077
  105.   opt[#ERRORBUFFER] = 10010
  106.   opt[#EXPECT_100_TIMEOUT_MS] = 227
  107.   opt[#FAILONERROR] = 45
  108.   opt[#FILETIME] = 69
  109.   opt[#FNMATCH_DATA] = 10202
  110.   opt[#FNMATCH_FUNCTION] = 20200
  111.   opt[#FOLLOWLOCATION] = 52
  112.   opt[#FORBID_REUSE] = 75
  113.   opt[#FRESH_CONNECT] = 74
  114.   opt[#FTP_ACCOUNT] = 10134
  115.   opt[#FTP_ALTERNATIVE_TO_USER] = 10147
  116.   opt[#FTP_CREATE_MISSING_DIRS] = 110
  117.   opt[#FTP_FILEMETHOD] = 138
  118.   opt[#FTP_RESPONSE_TIMEOUT] = 112
  119.   opt[#FTP_SKIP_PASV_IP] = 137
  120.   opt[#FTP_SSL_CCC] = 154
  121.   opt[#FTP_USE_EPRT] = 106
  122.   opt[#FTP_USE_EPSV] = 85
  123.   opt[#FTP_USE_PRET] = 188
  124.   opt[#FTPPORT] = 10017
  125.   opt[#FTPSSLAUTH] = 129
  126.   opt[#GSSAPI_DELEGATION] = 210
  127.   opt[#HEADER] = 42
  128.   opt[#HEADERDATA] = 10029
  129.   opt[#HEADERFUNCTION] = 20079
  130.   opt[#HEADEROPT] = 229
  131.   opt[#HTTP200ALIASES] = 10104
  132.   opt[#HTTP_CONTENT_DECODING] = 158
  133.   opt[#HTTP_TRANSFER_DECODING] = 157
  134.   opt[#HTTP_VERSION] = 84
  135.   opt[#HTTPAUTH] = 107
  136.   opt[#HTTPGET] = 80
  137.   opt[#HTTPHEADER] = 10023
  138.   opt[#HTTPPOST] = 10024
  139.   opt[#HTTPPROXYTUNNEL] = 61
  140.   opt[#IGNORE_CONTENT_LENGTH] = 136
  141.   opt[#INFILESIZE] = 14
  142.   opt[#INFILESIZE_LARGE] = 30115
  143.   opt[#INTERFACE] = 10062
  144.   opt[#INTERLEAVEDATA] = 10195
  145.   opt[#INTERLEAVEFUNCTION] = 20196
  146.   opt[#IOCTLDATA] = 10131
  147.   opt[#IOCTLFUNCTION] = 20130
  148.   opt[#IPRESOLVE] = 113
  149.   opt[#ISSUERCERT] = 10170
  150.   opt[#KEYPASSWD] = 10026
  151.   opt[#KRBLEVEL] = 10063
  152.   opt[#LOCALPORT] = 139
  153.   opt[#LOCALPORTRANGE] = 140
  154.   opt[#LOGIN_OPTIONS] = 10224
  155.   opt[#LOW_SPEED_LIMIT] = 19
  156.   opt[#LOW_SPEED_TIME] = 20
  157.   opt[#MAIL_AUTH] = 10217
  158.   opt[#MAIL_FROM] = 10186
  159.   opt[#MAIL_RCPT] = 10187
  160.   opt[#MAX_RECV_SPEED_LARGE] = 30146
  161.   opt[#MAX_SEND_SPEED_LARGE] = 30145
  162.   opt[#MAXCONNECTS] = 71
  163.   opt[#MAXFILESIZE] = 114
  164.   opt[#MAXFILESIZE_LARGE] = 30117
  165.   opt[#MAXREDIRS] = 68
  166.   opt[#NETRC] = 51
  167.   opt[#NETRC_FILE] = 10118
  168.   opt[#NEW_DIRECTORY_PERMS] = 160
  169.   opt[#NEW_FILE_PERMS] = 159
  170.   opt[#NOBODY] = 44
  171.   opt[#NOPROGRESS] = 43
  172.   opt[#NOPROXY] = 10177
  173.   opt[#NOSIGNAL] = 99
  174.   opt[#OBSOLETE40] = 10040
  175.   opt[#OPENSOCKETDATA] = 10164
  176.   opt[#OPENSOCKETFUNCTION] = 20163
  177.   opt[#PASSWORD] = 10174
  178.   opt[#PATH_AS_IS] = 234
  179.   opt[#PINNEDPUBLICKEY] = 10230
  180.   opt[#PIPEWAIT] = 237
  181.   opt[#PORT] = 3
  182.   opt[#POST] = 47
  183.   opt[#POSTFIELDS] = 10015
  184.   opt[#POSTFIELDSIZE] = 60
  185.   opt[#POSTFIELDSIZE_LARGE] = 30120
  186.   opt[#POSTQUOTE] = 10039
  187.   opt[#POSTREDIR] = 161
  188.   opt[#PREQUOTE] = 10093
  189.   opt[#PRIVATE] = 10103
  190.   opt[#PROGRESSDATA] = 10057
  191.   opt[#PROGRESSFUNCTION] = 20056
  192.   opt[#PROTOCOLS] = 181
  193.   opt[#PROXY] = 10004
  194.   opt[#PROXY_SERVICE_NAME] = 10235
  195.   opt[#PROXY_TRANSFER_MODE] = 166
  196.   opt[#PROXYAUTH] = 111
  197.   opt[#PROXYHEADER] = 10228
  198.   opt[#PROXYPASSWORD] = 10176
  199.   opt[#PROXYPORT] = 59
  200.   opt[#PROXYTYPE] = 101
  201.   opt[#PROXYUSERNAME] = 10175
  202.   opt[#PROXYUSERPWD] = 10006
  203.   opt[#PUT] = 54
  204.   opt[#QUOTE] = 10028
  205.   opt[#RANDOM_FILE] = 10076
  206.   opt[#range] = 10007
  207.   opt[#READDATA] = 10009
  208.   opt[#READFUNCTION] = 20012
  209.   opt[#REDIR_PROTOCOLS] = 182
  210.   opt[#REFERER] = 10016
  211.   opt[#RESOLVE] = 10203
  212.   opt[#RESUME_FROM] = 21
  213.   opt[#RESUME_FROM_LARGE] = 30116
  214.   opt[#RTSP_CLIENT_CSEQ] = 193
  215.   opt[#RTSP_REQUEST] = 189
  216.   opt[#RTSP_SERVER_CSEQ] = 194
  217.   opt[#RTSP_SESSION_ID] = 10190
  218.   opt[#RTSP_STREAM_URI] = 10191
  219.   opt[#RTSP_TRANSPORT] = 10192
  220.   opt[#SASL_IR] = 218
  221.   opt[#SEEKDATA] = 10168
  222.   opt[#SEEKFUNCTION] = 20167
  223.   opt[#SERVICE_NAME] = 10236
  224.   opt[#SHARE] = 10100
  225.   opt[#SOCKOPTDATA] = 10149
  226.   opt[#SOCKOPTFUNCTION] = 20148
  227.   opt[#SOCKS5_GSSAPI_NEC] = 180
  228.   opt[#SOCKS5_GSSAPI_SERVICE] = 10179
  229.   opt[#SSH_AUTH_TYPES] = 151
  230.   opt[#SSH_HOST_PUBLIC_KEY_MD5] = 10162
  231.   opt[#SSH_KEYDATA] = 10185
  232.   opt[#SSH_KEYFUNCTION] = 20184
  233.   opt[#SSH_KNOWNHOSTS] = 10183
  234.   opt[#SSH_PRIVATE_KEYFILE] = 10153
  235.   opt[#SSH_PUBLIC_KEYFILE] = 10152
  236.   opt[#SSL_CIPHER_LIST] = 10083
  237.   opt[#SSL_CTX_DATA] = 10109
  238.   opt[#SSL_CTX_FUNCTION] = 20108
  239.   opt[#SSL_ENABLE_ALPN] = 226
  240.   opt[#SSL_ENABLE_NPN] = 225
  241.   opt[#SSL_FALSESTART] = 233
  242.   opt[#SSL_OPTIONS] = 216
  243.   opt[#SSL_SESSIONID_CACHE] = 150
  244.   opt[#SSL_VERIFYHOST] = 81
  245.   opt[#SSL_VERIFYPEER] = 64
  246.   opt[#SSL_VERIFYSTATUS] = 232
  247.   opt[#SSLCERT] = 10025
  248.   opt[#SSLCERTTYPE] = 10086
  249.   opt[#SSLENGINE] = 10089
  250.   opt[#SSLENGINE_DEFAULT] = 90
  251.   opt[#SSLKEY] = 10087
  252.   opt[#SSLKEYTYPE] = 10088
  253.   opt[#SSLVERSION] = 32
  254.   opt[#STDERR] = 10037
  255.   opt[#TCP_KEEPALIVE] = 213
  256.   opt[#TCP_KEEPIDLE] = 214
  257.   opt[#TCP_KEEPINTVL] = 215
  258.   opt[#TCP_NODELAY] = 121
  259.   opt[#TELNETOPTIONS] = 10070
  260.   opt[#TFTP_BLKSIZE] = 178
  261.   opt[#TIMECONDITION] = 33
  262.   opt[#TIMEOUT] = 13
  263.   opt[#TIMEOUT_MS] = 155
  264.   opt[#TIMEVALUE] = 34
  265.   opt[#TLSAUTH_PASSWORD] = 10205
  266.   opt[#TLSAUTH_TYPE] = 10206
  267.   opt[#TLSAUTH_USERNAME] = 10204
  268.   opt[#TRANSFER_ENCODING] = 207
  269.   opt[#TRANSFERTEXT] = 53
  270.   opt[#UNIX_SOCKET_PATH] = 10231
  271.   opt[#UNRESTRICTED_AUTH] = 105
  272.   opt[#UPLOAD] = 46
  273.   opt[#URL] = 10002
  274.   opt[#USE_SSL] = 119
  275.   opt[#USERAGENT] = 10018
  276.   opt[#USERNAME] = 10173
  277.   opt[#USERPWD] = 10005
  278.   opt[#VERBOSE] = 41
  279.   opt[#WILDCARDMATCH] = 197
  280.   opt[#WRITEDATA] = 10001
  281.   opt[#WRITEFUNCTION] = 20011
  282.   opt[#XFERINFOFUNCTION] = 20219
  283.   opt[#XOAUTH2_BEARER] = 10220
  284.  
  285.   me.CURLOPT = opt
  286. end
  287.  
  288. ----------------------------------------
  289. --
  290. ----------------------------------------
  291. on _loadInfoConstants (me)
  292.  
  293.   info = [:]
  294.   info[#APPCONNECT_TIME] = 3145761
  295.   info[#CERTINFO] = 4194338
  296.   info[#CONDITION_UNMET] = 2097187
  297.   info[#CONNECT_TIME] = 3145733
  298.   info[#CONTENT_LENGTH_DOWNLOAD] = 3145743
  299.   info[#CONTENT_LENGTH_UPLOAD] = 3145744
  300.   info[#CONTENT_TYPE] = 1048594
  301.   info[#COOKIELIST] = 4194332
  302.   info[#EFFECTIVE_URL] = 1048577
  303.   info[#FILETIME] = 2097166
  304.   info[#FTP_ENTRY_PATH] = 1048606
  305.   info[#HEADER_SIZE] = 2097163
  306.   info[#HTTP_CONNECTCODE] = 2097174
  307.   info[#HTTPAUTH_AVAIL] = 2097175
  308.   info[#LASTSOCKET] = 2097181
  309.   info[#LOCAL_IP] = 1048617
  310.   info[#LOCAL_PORT] = 2097194
  311.   info[#NAMELOOKUP_TIME] = 3145732
  312.   info[#NUM_CONNECTS] = 2097178
  313.   info[#OS_ERRNO] = 2097177
  314.   info[#PRETRANSFER_TIME] = 3145734
  315.   info[#PRIMARY_IP] = 1048608
  316.   info[#PRIMARY_PORT] = 2097192
  317.   info[#PRIVATE] = 1048597
  318.   info[#PROXYAUTH_AVAIL] = 2097176
  319.   info[#REDIRECT_COUNT] = 2097172
  320.   info[#REDIRECT_TIME] = 3145747
  321.   info[#REDIRECT_URL] = 1048607
  322.   info[#REQUEST_SIZE] = 2097164
  323.   info[#RESPONSE_CODE] = 2097154
  324.   info[#RTSP_CLIENT_CSEQ] = 2097189
  325.   info[#RTSP_CSEQ_RECV] = 2097191
  326.   info[#RTSP_SERVER_CSEQ] = 2097190
  327.   info[#RTSP_SESSION_ID] = 1048612
  328.   info[#SIZE_DOWNLOAD] = 3145736
  329.   info[#SIZE_UPLOAD] = 3145735
  330.   info[#SPEED_DOWNLOAD] = 3145737
  331.   info[#SPEED_UPLOAD] = 3145738
  332.   info[#SSL_ENGINES] = 4194331
  333.   info[#SSL_VERIFYRESULT] = 2097165
  334.   info[#STARTTRANSFER_TIME] = 3145745
  335.   info[#TLS_SESSION] = 4194347
  336.   info[#TOTAL_TIME] = 3145731
  337.  
  338.   me.CURLINFO = info
  339. end
  340.  
  341. ----------------------------------------
  342. --
  343. ----------------------------------------
  344. on _loadFormConstants (me)
  345.  
  346.   form = [:]
  347.   form[#COPYNAME] = 1
  348.   form[#PTRNAME] = 2
  349.   form[#NAMELENGTH] = 3
  350.   form[#COPYCONTENTS] = 4
  351.   form[#PTRCONTENTS] = 5
  352.   form[#CONTENTSLENGTH] = 6
  353.   form[#FILECONTENT] = 7
  354.   form[#ARRAY] = 8
  355.   form[#OBSOLETE] = 9
  356.   form[#FILE] = 10
  357.   form[#BUFFER] = 11
  358.   form[#BUFFERPTR] = 12
  359.   form[#BUFFERLENGTH] = 13
  360.   form[#CONTENTTYPE] = 14
  361.   form[#CONTENTHEADER] = 15
  362.   form[#FILENAME] = 16
  363.   form[#END] = 17
  364.   form[#OBSOLETE2] = 18
  365.   form[#STREAM] = 19
  366.  
  367.   me.CURLFORM = form
  368. end
  369.  
[raw code]