接下来,我们来进行一个最常规的功能支持,让模块能够接受请求参数,并根据参数的变化,动态计算结果。
... /* allocate a buffer for your response body */ b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); if (b == NULL) { return NGX_HTTP_INTERNAL_SERVER_ERROR; } ngx_str_t var_user = ngx_string("arg_user"); ngx_uint_t key_user = ngx_hash_key(var_user.data, var_user.len); ngx_http_variable_value_t *val_user = ngx_http_get_variable(r, &var_user, key_user); if (val_user != NULL && val_user->not_found != 1) { char *tpl; asprintf(&tpl, "{\"name\":\"%s\"}", (char *)val_user->data); will_encrypt_string.data = (u_char *)tpl; will_encrypt_string.len = strlen(tpl); free(tpl); } else { char *preset_words = "hi"; will_encrypt_string.data = (u_char *)preset_words; will_encrypt_string.len = strlen(preset_words); } unsigned char *test_data = (unsigned char *)will_encrypt_string.data; int data_len = will_encrypt_string.len; ...
上面的代码展示了如何读取 GET 请求中的 user 参数,并将参数安全的拼合到字符串模版中,进行计算。相信即使你不熟悉 C 语言,参考上面的代码也可以快速进行调整,将计算逻辑调整到符合你预期的方式。
如果你希望模块能够非编译环境快速复用,可以参考其他的 Nginx 插件源代码,“实现 Nginx 读取静态文件”的功能,将编译至模块中的证书剥离出来。不过,如果你有 CI 环境,能够方便的持续获取最新的构建结果,将证书编译至模块中,可以获得更高的绝对性能。
其他
关于 Nginx 模块的开发,我个人建议阅读 Nginx 官方开发文档 和 Nginx 源代码,相比较国内外陈旧的文档,可以节约不少时间。
如果你对于加密内容的长度有特殊要求,需要加密特别长的内容,我建议你阅读这篇文章,考虑使用 EVP 函数替换文中的函数执行加密过程:Simple Public Key Encryption with RSA and OpenSSL。