[Lua] 使用 lua-http 套件,連線 HTTPS 網站並取得回應內容
不過那時候只拿來看 HTTP 回應狀態 (status code),沒有需要看回應內容 (body)。
今天想要同樣用 LuaSec 來取回應內容,卻不知道要怎麼做…
查了一下,有人說可以用 lua-http 來做,
就來試試看吧~
1. 安裝 lua-http 套件
本來想說用 sudo luarocks install http
就能輕鬆安裝 lut-http,
結果跟安裝 LuaSec 時一樣,出現訊息說要指定 CRYPTO_DIR,
後來試了半天,還得再加上 OPENSSL_DIR,
並讓兩個都指向 Mac 的 /usr/local/opt/openssl 目錄。
即使如此,最後還是出現了錯誤:
$ sudo luarocks install http CRYPTO_DIR=/usr/local/opt/openssl OPENSSL_DIR=/usr/local/opt/openssl Installing https://luarocks.org/http-0.4-0.all.rock Missing dependencies for http 0.4-0: cqueues >= 20161214 (not installed) luaossl >= 20161208 (not installed) basexx >= 0.2.0 (not installed) lpeg_patterns >= 0.5 (not installed) binaryheap >= 0.3 (not installed) fifo (not installed) ...... env MACOSX_DEPLOYMENT_TARGET=10.5 gcc -O2 -std=gnu99 -fPIC -g -Wall -Wextra -Wno-missing-field-initializers -Wno-initializer-overrides -Wno-unused -Wno-dollar-in-identifier-extension -Wno-deprecated-declarations -O2 -fPIC -D_REENTRANT -D_THREAD_SAFE -D_GNU_SOURCE -I"/usr/local/opt/openssl/include" -I"/usr/local/opt/openssl/include" -DSOCKET_DEBUG -DHAVE_CONFIG_H -DDNS_RANDOM=arc4random -c -o /private/tmp/luarocks_cqueues-20200726.54-0-4536103/cqueues-rel-20200726/src/lib/socket.o /private/tmp/luarocks_cqueues-20200726.54-0-4536103/cqueues-rel-20200726/src/lib/socket.c /private/tmp/luarocks_cqueues-20200726.54-0-4536103/cqueues-rel-20200726/src/lib/socket.c:498:10: error: thread-local storage is not supported for the current target static __thread char sslstr[256]; ^ 1 error generated. make: *** [/private/tmp/luarocks_cqueues-20200726.54-0-4536103/cqueues-rel-20200726/src/lib/socket.o] Error 1 Error: Failed installing dependency: https://luarocks.org/cqueues-20200726.54-0.src.rock - Build error: Failed building.
錯誤訊息是 thread-local storage is not supported for the current target,
又上網查了一下,似乎是這邊指定的 MACOSX_DEPLOYMENT_TARGET=10.5 太舊了,
導致 gcc 不支援 __thread 這個關鍵字…
那要怎麼讓 MACOSX_DEPLOYMENT_TARGET 可以設成新一點的值,
像是我的 macOS Big Sur 是 11.6,如果可以設成 11.6,應該就沒問題了…
執行 luarocks config
看一下目前的配置,
發現它有個變數 CC,內容就是 env MACOSX_DEPLOYMENT_TARGET=10.5 gcc
…
嗯… 有可疑的味道… (屁屁偵探上身!):
$ luarocks config ...... variables = { AR = "ar", BUNZIP2 = "bunzip2", CC = "env MACOSX_DEPLOYMENT_TARGET=10.5 gcc", CFLAGS = "-O2 -fPIC", CHMOD = "chmod", CMAKE = "cmake", ...... }
又 Google 了一下,看看要怎麼改這個變數…
(話說沒有 Google 的話,我是不是沒辦法寫程式了呀?!)
後來看起來是加在 luarocks 的參數列裡面就行了,
可以看到 MACOSX_DEPLOYMENT_TARGET 的值確實被我們改變了,
而最終 lua-http 也裝成功了:
$ sudo luarocks install http CRYPTO_DIR=/usr/local/opt/openssl/ OPENSSL_DIR=/usr/local/opt/openssl/ CC="env MACOSX_DEPLOYMENT_TARGET=11.6 gcc" ...... env MACOSX_DEPLOYMENT_TARGET=11.6 gcc -O2 -std=gnu99 -fPIC -g -Wall -Wextra -Wno-missing-field-initializers -Wno-initializer-overrides -Wno-unused -Wno-dollar-in-identifier-extension -Wno-deprecated-declarations -O2 -fPIC -D_REENTRANT -D_THREAD_SAFE -D_GNU_SOURCE -I"/usr/local/opt/openssl/include" -I"/usr/local/opt/openssl/include" -DSOCKET_DEBUG -DHAVE_CONFIG_H -DDNS_RANDOM=arc4random -c -o /private/tmp/luarocks_cqueues-20200726.54-0-1215889/cqueues-rel-20200726/src/lib/socket.o /private/tmp/luarocks_cqueues-20200726.54-0-1215889/cqueues-rel-20200726/src/lib/socket.c ...... http 0.4-0 is now installed in /usr/local (license: MIT)
2. 使用 lua-http 套件
用 Lua 直譯器來玩一下 lua-http 套件,
首先匯入 http.request 模組,用它來讀取 http://example.com:
$ lua Lua 5.4.1 Copyright (C) 1994-2020 Lua.org, PUC-Rio > http_request = require "http.request" > headers, stream = http_request.new_from_uri("http://example.com"):go()
看一下傳回來的 HTTP 回應標頭 (response header),
它看起來是一個 table,可以用 pl.pretty 來印出內容:
> headers http.headers{12 headers} > (require "pl.pretty")(headers) { ["arg 1"] = { [":status"] = nil, age = nil, ["cache-control"] = nil, ["content-length"] = nil, ["content-type"] = nil, date = nil, etag = nil, expires = nil, ["last-modified"] = nil, server = nil, vary = nil, ["x-cache"] = nil } } true
也有提供內建函式 get()
,可以從這表格中直接取值,
像是我想要看 HTTP status code :
> headers:get(":status") 200
要取得回應內容 (body) 的話,可以呼叫 stream:get_body_as_string()
,
這會將 body 的部分以文字形式傳回:
> body = stream:get_body_as_string() > body <!doctype html> <html> <head> <title>Example Domain</title> ...... </head> <body> <div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
這樣子,就可以用 lua-http 套件,
成功訪問一個 HTTP/HTTPS 網站,
並取得相關的 HTTP 回應標頭 (header) / 狀態碼 (status code) / 內容 (body) 囉~
參考資料:
Luarocks uses clang by default, how do I change it to GCC?
Doc to install lua-http on macos and lua 5.3