srvhttpClient.lua 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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(
  35. resopnd,
  36. function()
  37. skynet.error(debug.traceback())
  38. end,
  39. request
  40. )
  41. webclient:remove_request(request.req)
  42. requests[finish_key] = nil
  43. else
  44. skynet.sleep(1)
  45. end
  46. end
  47. requests = nil
  48. end
  49. --- 请求某个url
  50. -- @function request
  51. -- @string url url
  52. -- @tab[opt] get get的参数
  53. -- @param[opt] post post参数,table or string类型
  54. -- @bool[opt] no_reply 使用skynet.call则要设置为nil或false,使用skynet.send则要设置为true
  55. -- @treturn bool 请求是否成功
  56. -- @treturn string 当成功时,返回内容,当失败时,返回出错原因
  57. -- @usage skynet.call(webclient, "lua", "request", "http://www.dpull.com")
  58. -- @usage skynet.send(webclient, "lua", "request", "http://www.dpull.com", nil, nil, true)
  59. local function request(url, get, post, no_reply)
  60. if get then
  61. local i = 0
  62. for k, v in pairs(get) do
  63. k = webclient:url_encoding(k)
  64. v = webclient:url_encoding(v)
  65. url = string.format("%s%s%s=%s", url, i == 0 and "?" or "&", k, v)
  66. i = i + 1
  67. end
  68. end
  69. if post and type(post) == "table" then
  70. local data = {}
  71. for k, v in pairs(post) do
  72. k = webclient:url_encoding(k)
  73. v = webclient:url_encoding(v)
  74. table.insert(data, string.format("%s=%s", k, v))
  75. end
  76. post = table.concat(data, "&")
  77. end
  78. local req, key = webclient:request(url, post)
  79. if not req then
  80. return skynet.ret()
  81. end
  82. assert(key)
  83. local response = nil
  84. if not no_reply then
  85. response = skynet.response()
  86. end
  87. if requests == nil then
  88. requests = {}
  89. skynet.fork(query)
  90. end
  91. requests[key] = {
  92. url = url,
  93. req = req,
  94. response = response
  95. }
  96. end
  97. skynet.start(
  98. function()
  99. skynet.dispatch(
  100. "lua",
  101. function(session, source, command, ...)
  102. assert(command == "request")
  103. request(...)
  104. end
  105. )
  106. end
  107. )