OpenResty实战之gzip解压与json解析

  Seves

原文链接:OpenResty实战之gzip解压与json解析

客户端访问 OpenResty ,如果配置文件nginx.conf里配置了 gzip 相关选项,OpenResty 会自动根据客户端请求返回对应的格式。

如果 OpenResty 访问后端服务,并且带有gzip header 例如gzip-deflate或deflate-raw,并且需要在 OpenResty 一端解析修改某些值时,需要先解压,然后再修改。

解压代码如下:

		local ffizlib = require('ffi-zlib')
		local output_table = {}
		local count = 0
		local output = function(data)
			table_insert(output_table, data)
		end
		local input = function(bufsize)
			local start = count > 0 and bufsize*count or 1
			local data = body:sub(start, (bufsize*(count+1)-1) )  
			count = count + 1  
			return data
		end
		local chunk =16384
		local ok, err = ffizlib.inflateGzip(input, output, chunk)
		if not ok then
			-- Err message
			ngx_log(ngx_INFO,"err:", err)
		end
		local output_data = table_concat(output_table,'')
		--ngx_log(ngx_INFO,"output_data: ", output_data)

上面代码最后output_data就是解压后的数据,是字符串类型,可以进行相关的替换和解析等操作。

例子1: 使用gsub进行全居替换

local body, n, err = ngx.re.gsub(output_data, "www.11.com", "m.11.com")


例子2: json解析

local cjson = require("cjson")
local retTable = {};    --最终产生json的表
local requestresultdata = cjson.decode(output_data);    --解析json字符串
retTable["Count"]="7"
retTable["Key"]=requestresultdata["Key"]
local jsonStr = cjson.encode(retTable)    --将表数据编码成json字符串

本文链接:https://www.tech-field.org/openresty-gzip-and-json.html

fc