Symfoware

Symfowareについての考察blog

luvi + luv http postのサンプル

luvi + luvでhttp getしてみました。
luvi luvを使用してhttp getリクエストを実行する

ついでにpostしてみます。
postの方法については、こちらを参考にしました。
telnetでhttpとか


とりあえず動いたレベルのソースですが備忘録&バックアップとして。


  1. local uv = require('uv')
  2. function split(str, pat)
  3. local t = {} -- NOTE: use {n = 0} in Lua-5.0
  4. local fpat = "(.-)" .. pat
  5. local last_end = 1
  6. local s, e, cap = str:find(fpat, 1)
  7. while s do
  8.      if s ~= 1 or cap ~= "" then
  9.      table.insert(t,cap)
  10.      end
  11.      last_end = e+1
  12.      s, e, cap = str:find(fpat, last_end)
  13. end
  14. if last_end <= #str then
  15.      cap = str:sub(last_end)
  16.      table.insert(t, cap)
  17. end
  18. return t
  19. end
  20. function http_get(host, port, resource)
  21.     local hostinfo = uv.getaddrinfo(host)
  22.     local ip = hostinfo[1].addr
  23.     local client = uv.new_tcp()
  24.     uv.tcp_connect(client, ip, port)
  25.     uv.write(client, string.format('GET %s HTTP/1.1\n\n', resource))
  26.     local res_all = ''
  27.     uv.read_start(client, function(err, chunk)
  28.         if chunk then
  29.             res_all = res_all .. chunk
  30.         else
  31.             uv.close(client)
  32.         end
  33.     end)
  34.     uv.run('default')
  35.     
  36.     local response = {}
  37.     local r = split(res_all, '\r\n')
  38.     local h = split(r[1], ' ')
  39.     response.status_code = h[2]
  40.     response.status_name = h[3]
  41.     
  42.     local body_index = 2
  43.     while true do
  44.         local line = r[body_index]
  45.         body_index = body_index + 1
  46.         if line == '' then
  47.             break
  48.         end
  49.     end
  50.     
  51.     response.body = r[body_index]
  52.     for i = body_index + 1, #r do
  53.         response.body = response.body .. '\r\n' .. r[i]
  54.     end
  55.     
  56.     return response
  57. end
  58. function http_post(host, port, resource, post_values)
  59.     local hostinfo = uv.getaddrinfo(host)
  60.     local ip = hostinfo[1].addr
  61.     
  62.     local post_value = ''
  63.     for k,v in pairs(post_values) do
  64.         if post_value ~= '' then
  65.             post_value = post_value .. '&'
  66.         end
  67.         post_value = post_value .. string.format('%s=%s', k, v)
  68.     end
  69.     local client = uv.new_tcp()
  70.     uv.tcp_connect(client, ip, port)
  71.     uv.write(client, string.format('POST %s HTTP/1.1\n', resource))
  72.     uv.write(client, 'Content-Type: application/x-www-form-urlencoded\n')
  73.     uv.write(client, string.format('Content-Length: %d\n\n', string.len(post_value)))
  74.     uv.write(client, post_value)
  75.     local res_all = ''
  76.     uv.read_start(client, function(err, chunk)
  77.         if chunk then
  78.             res_all = res_all .. chunk
  79.         else
  80.             uv.close(client)
  81.         end
  82.     end)
  83.     uv.run('default')
  84.     
  85.     local response = {}
  86.     local r = split(res_all, '\r\n')
  87.     local h = split(r[1], ' ')
  88.     response.status_code = h[2]
  89.     response.status_name = h[3]
  90.     
  91.     local body_index = 2
  92.     while true do
  93.         local line = r[body_index]
  94.         body_index = body_index + 1
  95.         if line == '' then
  96.             break
  97.         end
  98.     end
  99.     
  100.     response.body = r[body_index]
  101.     for i = body_index + 1, #r do
  102.         response.body = response.body .. '\r\n' .. r[i]
  103.     end
  104.     
  105.     return response
  106. end




utils.luaとした場合、main.luaからの呼び出しサンプル。


  1. local bundle = require('luvi').bundle
  2. bundle.register("utils", "utils.lua")
  3. require('utils')
  4. local response = http_get('127.0.0.1', '8080', '/sample.php?name=symfo')
  5. print(response.status_code)
  6. print(response.body)
  7. data = {
  8.     name = 'symfo',
  9.     key = 'value'
  10. }
  11. local response = http_post('127.0.0.1', '8080', '/sample.php', data)
  12. print(response.status_code)
  13. print(response.body)





【参考URL】

telnetでhttpとか

Split Join

Luaのお勉強 いろいろなループ方法(while,repeat,for,pairs)

Luaのお勉強 文字列操作

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/02/17(水) 23:08:50|
  2. Lua
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<luvi 実行時引数の取得と環境変数の取得 | ホーム | luvi 別ファイルに記載したプログラムを読み込む>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1845-43616c34
この記事にトラックバックする(FC2ブログユーザー)