srvHttpClient.lua 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. --- webclient. (skynet服务).
  2. -- @source https://github.com/dpull/lua-webclient
  3. -- @module webclient
  4. -- @usage local webclient = skynet.newservice("webclient")
  5. local skynet = require "skynet"
  6. local webclientlib = require "webclient"
  7. local webclient = webclientlib.create()
  8. local requests = nil
  9. local assert = assert
  10. local table = table
  11. local string = string
  12. local function resopnd(request)
  13. if not request.response then
  14. return
  15. end
  16. local content, errmsg = webclient:get_respond(request.req)
  17. if not errmsg then
  18. request.response(true, true, content)
  19. else
  20. local info = webclient:get_info(request.req)
  21. if info.response_code == 200 and not info.content_save_failed then
  22. request.response(true, true, content, errmsg)
  23. else
  24. request.response(true, false, errmsg, info)
  25. end
  26. end
  27. end
  28. local function query()
  29. while next(requests) do
  30. local finish_key = webclient:query()
  31. if finish_key then
  32. local request = requests[finish_key];
  33. assert(request)
  34. xpcall(resopnd, function() skynet.error(debug.traceback()) end, request)
  35. webclient:remove_request(request.req)
  36. requests[finish_key] = nil
  37. else
  38. skynet.sleep(1)
  39. end
  40. end
  41. requests = nil
  42. end
  43. --- 请求某个url
  44. -- @function request
  45. -- @string url url
  46. -- @tab[opt] get get的参数
  47. -- @param[opt] post post参数,table or string类型
  48. -- @bool[opt] no_reply 使用skynet.call则要设置为nil或false,使用skynet.send则要设置为true
  49. -- @treturn bool 请求是否成功
  50. -- @treturn string 当成功时,返回内容,当失败时,返回出错原因
  51. -- @usage skynet.call(webclient, "lua", "request", "http://www.dpull.com")
  52. -- @usage skynet.send(webclient, "lua", "request", "http://www.dpull.com", nil, nil, true)
  53. local function request(url, get, post, no_reply)
  54. if get then
  55. local i = 0
  56. for k, v in pairs(get) do
  57. k = webclient:url_encoding(k)
  58. v = webclient:url_encoding(v)
  59. url = string.format("%s%s%s=%s", url, i == 0 and "?" or "&", k, v)
  60. i = i + 1
  61. end
  62. end
  63. if post and type(post) == "table" then
  64. local data = {}
  65. for k,v in pairs(post) do
  66. k = webclient:url_encoding(k)
  67. v = webclient:url_encoding(v)
  68. table.insert(data, string.format("%s=%s", k, v))
  69. end
  70. post = table.concat(data , "&")
  71. end
  72. local req, key = webclient:request(url, post)
  73. if not req then
  74. return skynet.ret()
  75. end
  76. assert(key)
  77. local response = nil
  78. if not no_reply then
  79. response = skynet.response()
  80. end
  81. if requests == nil then
  82. requests = {}
  83. skynet.fork(query)
  84. end
  85. requests[key] = {
  86. url = url,
  87. req = req,
  88. response = response,
  89. }
  90. end
  91. skynet.start(function()
  92. skynet.dispatch("lua", function(session, source, command, ...)
  93. assert(command == "request")
  94. request(...)
  95. end)
  96. end)