2022年6月24日 星期五

Go開發筆記 - 使用 net/http 處理 URL Redirect 和 Cookie 之 Service Unit Test 需求

最近用 Golang 撰寫 Service Unit Test 時,練了一下 net/http 要如何處理 HTTP Response Header Location 的處理。主要是在使用 net/http 的 http.Client 時,可以加設定 CheckRedirect 的機制來阻擋 URL Redirect 的行為,藉以檢驗 URL Redirect 是否正確。

//httpClient := http.DefaultClient
httpClient := &http.Client{}

httpClient.CheckRedirect = func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
}

if jar, err := cookiejar.New(nil); err == nil {
httpClient.Jar = jar
}

如此,做 Service Unit Test 時,在發送 HTTP GET request or HTTP HEAD request 時,可以停下來,看看要跳轉到哪裡,以此判斷跳轉機制是否正常。

接著,碰到了另一個問題: 在 follow URL Redirect 後,似乎跳轉過程中產生的 Cookie 都沒有被記錄下來?例如最後的 response.Cookies() 輸出,的確只列出最後的 Response Cookies 資料。這時想要驗證中間的 Cookie 資訊,則需要瀏覽 httpClient.Jar 資料:

for _, c := range(httpClient.Jar.Cookies(res.Request.URL)) {
fmt.Println(c)
}

如此就可以搞定 URL Redirect 驗證,以及全部過程的產生的 Cookie 檢查!當然,若要更細膩地去追蹤每次 URL Redirect 時,產生的 Response Cookies 資料,可以透過 httpClient.CheckRedirect 那處理:

httpClient.CheckRedirect = func(req *http.Request, via []*http.Request) error {
for _, c := range (req.Response.Cookies()) {
fmt.Println(c)
}
}

參考資料:
  • https://pkg.go.dev/net/http#Client
  • https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/client.go
  • https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/client.go;l=493
  • https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/client.go;l=811
  • https://pkg.go.dev/net/http/cookiejar#Jar.Cookies
  • https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/cookiejar/jar.go

2022年6月21日 星期二

VIM 設定檔(vimrc)切換方式 @ macOS 12.4

由於 coding style 的規劃,需要調整 vim editor 的行為:

set tabstop=4
set shiftwidth=4
set expandtab

因此,設計一個 vim_env.sh 來做切換啟用:

% vim --version
...
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/usr/share/vim"

% cat project_vimrc 
try
    source $VIM/vimrc 
catch
    echo "\$VIM/vimrc not found"
endtry

set tabstop=4
set shiftwidth=4
set expandtab

% cat vim_env.sh
#!/bin/bash

SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]:-$0}"; )" &> /dev/null && pwd 2> /dev/null; )";
alias vim='vim -u $SCRIPT_DIR/project_vimrc'
echo "Update vim environment (using 'type vim' to show raw command) "

% type vim
vim is an alias for vim -u $SCRIPT_DIR/project_vimrc

接著,就靠 alias 來啟用專案 vimrc

2022年6月19日 星期日

隔離險理賠 - 富邦疫苗隔離險理賠郵寄申請


四月就被隔離了,恰好 110 年打疫苗前,保了個疫苗險,原本只是單純保個疫苗不良事件,殊不知翻出來看有隔離補償。找了個時間打電話問問看申辦流程,客服要求留完資料後,會有專人聯繫,可惜過了兩個月也沒接到過電話,現在疫情放緩,來把資料郵寄過去試試。

首先,先到 富邦產險 - 防疫險專區 網站,查一下理賠申請方式,內容都是建議,直接攜帶好相關證件直接到現場辦理。先來試試看郵件這招。

致電富邦產險客服(免付費電話,手機可打 0800-009-888 ),確認一下郵寄收件的切確地址跟收件人,於是得知台北地區就直接掛號寄到總公司即可。

地址:台北市中山區遼寧街179號7樓
電話:(02)66367890
富邦壽險 個人理賠部 收

至於文件方面,就下載一份理賠申請單填寫一下,再將身分證影本, 銀行帳戶影本和隔離簡訊列上,有順便把當初衛福部的隔離單印一下(六月下旬,點擊原本的簡訊,已經看不到帶有個人資訊的網頁內容),再看看是不是這樣就搞定。

參考資料:

2022年6月16日 星期四

C開發筆記 - 使用 JS Engine : Duktape 接收與傳遞 Javascript Object

對嵌入式設備來說,如果資源夠大的話,直接用 Node.js 絕對是個不錯方案,受限於硬體資源限制,採用了 Duktape JS Engine。

寫 C Code 操作 Duktape JS Engine 時,呼叫的方式還滿像以前學生時代寫組語的感覺,要先一步步把參數先配置好,接著在呼叫函示去運算。這次就筆記一下,如何從 JS Code 傳遞 Object 到 C Code,以及 C Code 要怎樣傳遞 Object 回 JS Code。

從 JS Code 傳遞 Object 到 C Code:

//
// _js_helper_fetch_url_more 是從 C Code 植入 function,並且接送一個 JS Object,有 url 跟 request_header 兩個屬性
//
if (typeof _js_helper_fetch_url_more !== "undefined") {
    var ret = _js_helper_fetch_url_more({
        url: 'https://ipinfo.io/country',
        request_header: [
            'Content-Type: HelloWorld',
            'X-MAN: HelloWorld',
        ],  
    }); 
    console.log(JSON.stringify(ret));
}

在 C Code 要取得傳進來的 JS Object,並存取 url 跟 request_header 兩個屬性:

if (duk_is_object(ctx, -1) && duk_has_prop_string(ctx, -1, "url")) {
    duk_get_prop_string(ctx, -1, "url");
    const char *url = duk_to_string(ctx, -1);
    duk_pop(ctx);
}

if (duk_has_prop_string(ctx, -1, "request_header")) {
    duk_get_prop_string(ctx, -1, "request_header");
    if (duk_is_object(ctx, -1) && duk_has_prop_string(ctx, -1, "length")) {
        duk_get_prop_string(ctx, -1, "length");
        int header_length = duk_get_int(ctx, -1);
        printf("#JS_Helper_Fetch_Url_More> access input_object.request_header.length: %d\n", header_length);
        duk_pop(ctx);

        for (int i=0 ; i<header_length ; ++i) {
            duk_get_prop_index(ctx, -1, i);
            const char *header_value = duk_get_string(ctx, -1);
            printf("#JS_Helper_Fetch_Url_More> access input_object.request_header[%d] = [%s]\n", i, header_value);
            duk_pop(ctx);
        }
    }
    duk_pop(ctx);
}

最後,想要從 C Code 傳遞一個 JS Object 回去的方式:

//
// 傳回 {"status": true, "errorCode": 0}
//

duk_idx_t obj_idx;
obj_idx = duk_push_object(ctx);

int errorCode = 0;
duk_push_int(ctx, errorCode);
duk_put_prop_string(ctx, obj_idx, "error_code");

if (errorCode == 0) {
    duk_push_true(ctx);
} else {
    duk_push_false(ctx);
}
duk_put_prop_string(ctx, obj_idx, "status");

更多完整資訊,請參考:github.com/changyy/study-duktape

2022年6月12日 星期日

PHP開發筆記 - 書:現代PHP, 新的特點及良好習慣(Modern PHP: New Features and Good Practices)

書:現代PHP, 新的特點及良好習慣(Modern PHP: New Features and Good Practices)

幾週前,找資料時看到了這本書,且幾年前也有人在 IT 鐵人賽 提到。這是一本 2015 年 02 月歐萊禮出的書。只是近幾年已經有許多熱門的語言跟誇架,如 Python, Ruby(RoR), Javascript(Node.js), Golang,似乎誰也沒在記得 PHP、Facebook 出的 HHVM?我也是翻了書才知道還有個 Hack 語言。
沒想到自己已經寫了超過15年PHP了吧?工作上真的還滿夠用,偶爾寫寫 python 跟 php 工具做事。但看了這本 Modern PHP 後,反而補充一段遺失的知識,算是滿值得的。書中的內容對我來說大概有50%以上是已知的,很快就看完了,屬於工作上或學生時代就知道的事,也代表持續使用 PHP 多少都會有所成長,但實在不如讀書吸收的知識效率高,翻出看個小時就就獲得幾年功力。

另外一提,書中有些工具教學的範例套件不見得是現在熱門的工具,建議使用上時還先找一下網路上資源,例如當紅的 PHP Mail 套件就是 PHPMailer ,我也在 2015 年用 PHPMailer 幫公司開發一套可發送百萬 EDM 的小服務,近年則是被同事擴充成可自動化排程架構了。

總之,我還是買了一本來收藏,也詢問 碁峰圖書 得知沒有電子書服務(早年 O'Reilly 有可以下的電子書,並靠 Social DRM,現在則改成訂閱制)。往後則是使用PHP語言時,要時時提醒自己多用 composer 管理做事,包括工具開發等。如果持續朝向如何規範更加的產出程式碼品質時,那真的有源源不絕的目標可以邁進的。