文档章节

Openresty使用zlib解压缩response body

就不穿小内
 就不穿小内
发布于 07/13 17:37
字数 488
阅读 50
收藏 0
lua

「深度学习福利」大神带你进阶工程师,立即查看>>>

产品需要对当前的所有接口进行统计数据,其中需要边缘层返回需要用到的response body的状态码以及信息

概述

目前后台返回的response body既有压缩又有不压缩,所以导致处理数据需要进行分支处理,否则会导致无法访问,大概思路就是在你的openresty中下的配置文件增加一个处理response body的字段body_filter_by_lua_file,然后在该入口内处理你的逻辑,在这里我这的大概逻辑是解码,解压缩,处理异常,然后把数据写到日志

处理流程

  • 在配置文件你要处理的server中添加
#conf/lua/get_resp.lua:相对路径下的lua处理文件
body_filter_by_lua_file conf/lua/get_resp.lua;

# 设置日志变量
set $resp_code '';
set $resp_msg '';
wget https://github.com/hamishforbes/lua-ffi-zlib
  • 编写逻辑代码
local json = require "cjson"
local zlib = require 'ffi-zlib'
``
function json_decode(str)
    local data = nil
    _, err = pcall(function(str) return json.decode(str) end, str)
    return data, err
end
local chunk = string.sub(ngx.arg[1], 1, 1000)
ngx.ctx.buffered = (ngx.ctx.buffered or "") .. chunk
if ngx.arg[2] then
   --ngx.ctx.buffered获取到response body的压缩数据       compressed = ngx.ctx.buffered
    output_table = {}
    local chk = 16384
    local input = function(bufsize)
          local start = count > 0 and bufsize*count or 1
          local data = compressed:sub(start, (bufsize*   (count+1)-1))
          count = count + 1
          return data
    end

    local output = function(data)
          table_insert(output_table, data)
    end
    local ok, err = zlib.inflateGzip(input, output, chk)
    if not ok then
       ngx.log(ngx.ERR,'decompress err:'..err)
       return
    end
    local output_data = table_concat(output_table,'')
    --ngx.log(ngx.ERR,'decompress res:'..output_data)
    local err,data  = json_decode(output_data)
     if err then
       ngx.log(ngx.ERR,'compress decode err:'..err) 
    end
    -- data就是需要的table数据
    -- 这里也需要做异常判断,你自己加就好了
    ngx.var.resp_code = data['code']
    ngx.var.resp_msg = data['msg']
end
就不穿小内
粉丝 4
博文 73
码字总数 41096
作品 0
海淀
私信 提问
加载中
请先登录后再评论。
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.7K
7
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
8
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
CDH5: 使用parcels配置lzo

一、Parcel 部署步骤 1 下载: 首先需要下载 Parcel。下载完成后,Parcel 将驻留在 Cloudera Manager 主机的本地目录中。 2 分配: Parcel 下载后,将分配到群集中的所有主机上并解压缩。 3 激...

cloud-coder
2014/07/01
6.8K
1
Java™ 编译器--Janino

Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,...

匿名
2013/04/02
4.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

jQuery Ajax调用后如何管理重定向请求 - How to manage a redirect request after a jQuery Ajax call

问题: I'm using $.post() to call a servlet using Ajax and then using the resulting HTML fragment to replace a div element in the user's current page. 我使用$.post()使用Ajax调用......

javail
55分钟前
15
0
没有指定分支的“git push”的默认行为 - Default behavior of “git push” without a branch specified

问题: I use the following command to push to my remote branch: 我使用以下命令推送到我的远程分支: git push origin sandbox If I say 如果我说 git push origin does that push ch......

技术盛宴
今天
21
0
为什么在允许某些Unicode字符的注释中执行Java代码?

问题: The following code produces the output "Hello World!" 以下代码生成输出“Hello World!” (no really, try it). (不,真的,试试吧)。 public static void main(String... args......

富含淀粉
今天
18
0
什么是按位移位(位移)运算符以及它们如何工作? - What are bitwise shift (bit-shift) operators and how do they work?

问题: I've been attempting to learn C in my spare time, and other languages (C#, Java, etc.) have the same concept (and often the same operators) ... 我一直在尝试在业余时间学习......

法国红酒甜
今天
32
0
OSChina 周二乱弹 —— 卧槽 李荣浩的契约兽啊

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《红色的回忆》- 痛仰乐队 手机党少年们想听歌,请使劲儿戳(这里) 动弹, 又好多...

小小编辑
今天
92
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部