[Lua] 使用 lua-http 套件,連線 HTTPS 網站並取得回應內容

[Lua] 使用 lua-http 套件,連線 HTTPS 網站並取得回應內容

之前使用 LuaSec 套件來連線 HTTPS 網站

不過那時候只拿來看 HTTP 回應狀態 (status code),沒有需要看回應內容 (body)。

今天想要同樣用 LuaSec 來取回應內容,卻不知道要怎麼做…

 

查了一下,有人說可以用 lua-http 來做,

就來試試看吧~

 

1. 安裝 lua-http 套件

本來想說用  

sudo luarocks install http
sudo luarocks install http 就能輕鬆安裝 lut-http,

結果跟安裝 LuaSec 時一樣,出現訊息說要指定 CRYPTO_DIR,

後來試了半天,還得再加上 OPENSSL_DIR,

並讓兩個都指向 Mac 的 /usr/local/opt/openssl 目錄。

即使如此,最後還是出現了錯誤:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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.
$ 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.
$ 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
luarocks config 看一下目前的配置,

發現它有個變數 CC,內容就是  

env MACOSX_DEPLOYMENT_TARGET=10.5 gcc
env MACOSX_DEPLOYMENT_TARGET=10.5 gcc

嗯… 有可疑的味道… (屁屁偵探上身!):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ luarocks config
......
variables = {
AR = "ar",
BUNZIP2 = "bunzip2",
CC = "env MACOSX_DEPLOYMENT_TARGET=10.5 gcc",
CFLAGS = "-O2 -fPIC",
CHMOD = "chmod",
CMAKE = "cmake",
......
}
$ luarocks config ...... variables = { AR = "ar", BUNZIP2 = "bunzip2", CC = "env MACOSX_DEPLOYMENT_TARGET=10.5 gcc", CFLAGS = "-O2 -fPIC", CHMOD = "chmod", CMAKE = "cmake", ...... }
$ 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 也裝成功了:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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)
$ 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)
$ 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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ 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()
$ 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()
$ 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 來印出內容:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
> 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
> 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
> 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()
get() ,可以從這表格中直接取值,

像是我想要看 HTTP status code :

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
> headers:get(":status")
200
> headers:get(":status") 200
> headers:get(":status")
200

 

要取得回應內容 (body) 的話,可以呼叫  

stream:get_body_as_string()
stream:get_body_as_string() ,

這會將 body 的部分以文字形式傳回:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
> 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>
> 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>
> 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

(本頁面已被瀏覽過 451 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料